2017-02-27 6 views
1

Ich habe eine große CSV-Datei, die ich versuche, in kleinere Unterlisten zu machen.Warum funktioniert dieser Code nicht? Ich sollte Werte trennen?

Das einzige Problem ist, dass es nicht tut, was es sein sollte ... oder zumindest Daten trennt richtig mit nur ein paar Sachen richtig getrennt sein

Mein Problem: Ich habe eine CSV-Datei, die Daten hat das geht zwischen 90 und 3 Meter tief, und die Daten werden so hin und her gehen. Ich benutze den neuesten Python.

Immer wenn die Zahl wieder ansteigt, möchte ich sie trennen.

ex. (Tiefe) 88, 77, 50, 20, 5, 90, 76, 54, 34, 15, 8, 4, 81, 74, 62, 51, 49, 30, 22, 10, 8 ... und so weiter . Es geht weiter zwischen 90 bis 3 und so weiter.

Was ich tun möchte, ist die Daten jedes Mal zu trennen, wenn es zwischen 90 und 3 geht. Sobald es getrennt ist, möchte ich die letzten und ersten Werte in dieser Liste nehmen. Wie so ex. 88, 77, 50, 20, 5 (hier getrennt), 90, 76, 54, 34, 15, 8, 4 (hier getrennt) 81, 74, 62, 51, 49, 30, 22, 10, 8 hier getrennt)... und so weiter.

Hier ist mein Code:

{ '1':

#two sets of data that you test with. 
m = ['9.90203', '9.79947', '9.66876', '9.54503', '9.42167', '9.2977', '9.17321', '9.05162', '8.11487', '8.038', '7.96111', '7.85746', '7.72701', '7.59709', '7.46781', '7.34127', '7.21842', '7.09548', '6.96798', '6.57355', '6.444', '6.32245', '6.23818', '6.15369', '6.04973', '4.63443', '4.49823', '4.36232', '4.21442', '4.0642', '26.5645', '26.4945', '26.4232', '26.3592', '26.2948', '23.418', '23.3667', '23.2756', '23.1856', '22.1849', '22.0822', '22.0191', '21.9671', '21.9154', '21.8641', '20.436', '20.3865', '20.3364', '20.2083', '20.0915', '19.9758', '19.8601', '19.7446', '19.6317', '18.1383', '17.9834', '17.8271', '17.7529', '17.6949', '17.6317', '17.5675', '17.4362', '16.581', '16.4745', '16.378', '16.2562', '16.1471', '16.0222', '15.89', '14.9752', '14.8725', '14.7666', '14.6234', '14.469', '14.3148', '13.7696', '13.6465', '13.5363', '13.4712', '13.4069', '13.3421', '13.2732', '13.1375', '13.0014', '12.4809', '12.3585', '12.2339', '12.121', '12.0116', '11.901', '11.7906', '11.6645', '11.5278', '11.3931', '11.2551', '11.1211', '10.993', '10.8501', '10.7205', '10.6026', '10.4992', '10.3952'] 
l = ['8.18142', '8.11846', '8.05988', '59.4627', '59.3455', '59.2296', '58.4541', '58.3302', '58.2265', '58.1239', '58.0314', '57.9405', '57.8496', '57.7514', '57.6746', '57.6098', '57.5414', '57.4722', '57.3517', '57.2151', '57.0934', '56.9704', '56.8361', '56.6993', '56.564', '56.4287', '56.3106', '56.2', '56.0877', '55.9782', '55.8869', '55.8223', '55.7578', '55.6933', '55.605', '55.4949', '55.3858', '55.2761', '55.1612', '55.0097', '54.8786', '54.7385', '54.6315', '54.5282', '54.4292', '54.327', '54.2217', '54.1127', '54.0037', '53.8938', '53.7695', '53.6271', '53.4857', '53.3437', '53.2254', '53.1712', '53.12', '53.0679', '53.0102', '52.9126', '52.8148', '52.7182', '52.6207', '52.491', '52.3561', '52.2267', '52.0908', '51.9405', '51.7786', '51.6421', '51.5043', '51.4063', '51.3087', '51.2117', '51.1141', '51.0304', '50.9446', '50.8577', '50.7744', '50.6716', '50.5655', '50.4625', '50.3598', '50.2569', '50.153', '50.0494', '49.9461', '49.8308', '49.7058', '49.582', '49.4583', '49.3473', '49.251', '49.1533', '49.0561', '48.953', '48.83', '48.7064', '48.5812', '48.4635', '48.3852', '48.2998', '48.2219', '48.1428', '48.0327', '47.9221', '47.8114', '47.7007', '47.5964', '47.4905', '47.3875', '47.2847', '47.1595', '47.0424', '46.9264'] 

group =0 
temp = [] 
splited_list = {} 
lengh = len(l) 

for i in range(lengh): 
    if not i == lengh-1: 
     if l[i] > l[i+1]: 
      temp.append(l[i]) 
     else: 
      temp.append(l[i]) 
      group +=1 
      splited_list.update({str(group):temp}) 
      temp = [] 
    else: 
     if l[i] < l[-2]: 
      temp.append(l[i]) 
      group +=1 
      splited_list.update({str(group):temp}) 
      break 
     else: 
      group +=1 
      splited_list.update({str(group):[l[i]]}) 
      break 

print (splited_list) 

hier meine Ausgabe ist [ '8,18142', '8,11846', '8,05988', '59 0,4627' , ' 59.3455 ', '59 .2296', '58 .4541 ', '58 .3302', '58 .2265 ', '58 .1239', '58 .0314 ', '57.9405', '57.8496 ', '57.7514', '57.6746 ', '57.6098', '57.5414 ' , '57 .4722 ', '57 .3517', '57 .2151 ', '57 .0934', '56.9704 ', '56.8361', '56 .6993 ', '56 .564', '56 .4287 ', '56 .3106', '56 .2 ', '56 .0877', ' 55,9782 ', '55, 8869', '55, 8223 ', '55, 7578', '55, 6933 ', '55, 605', '55, 4949 ', '55, 3858', '55, .2761 ', '55, 1612', '55, 0097 ', '54, 87 86, 54, 7385 ,54, 6315, 54, 5282 ,54,4292 ,54, 327 ,54, 2217 ,54, 11227 ,54, 0037 ,53, 8938 ,53, 7695 ,53, 6271 ,53, 4857 '53 .3437 ', '53 .2254', '53 .1712 ', '53 .12', '53.0679 ', '53.0102', '52.9126 ', '52.8148', '52.7182 ', '52.6207', '52.491 ', '52 .3561', ' 52.2267 ', '52.0908', '51.9405 ', '51.7786', '51.6421 ', '51.5043', '51.4063 ', '51.3087', '51.2117 ', '51.1141', '51.0304 ', '50.9446', '50.8577 ' "50 .7744", "50 .6716", "50 .5655", "50 .4625", "50 .3598", "50 .2569", "50 .153", "50 .0494", "49.9461", "49.8308", "49.7058", "49.582", " 49,4583 ', '49,3473', '49,251 ', '49,1533', '49,0561 ', '48,953', '48,83 ', '48,7064', '48,5812 ', '48,4635', '48,3852 ', '48,2998', '48,2219 ' , 48, 1428, 48, 0327, 47, 9221, 47, 8114, 47, 7007, 47, 5964, 47, 4905, 47, 3875

Hier ist Mein gewünschter Ausgang:

{ '1': [ '8,18142', '8,11846', '8,05988'], '2': ['59 0,4627' , '59 0,3455' , '59 0,2296' , '58 0,4541' , "58 .3302", "58 .2265", "58 .1239", "58 .0314", "57.9405", "57.8496", "57.7514", "57.6746", "57.6098", "57.5414", "57.4722", "57.3517", "57 .2151" ', '57 .0934', '56.9704 ', '56 .8361', '56 .6993 ', '56 .564', '56 .4287 ', '56 .3106', '56 .2 ', '56 .0877', '55 .9782 ', '55 .8869', '55 .8223 ', '55, 7578 ', '55, 6933', '55, 605 ', '55, 4949', '55, 3858 ', '55, .2761', '55, 1612 ', '55, 0097', '54, 8786 ', '54, 7385', '54, 6315 ', '54, 5282', '54, 42292 "54 .327", "54 .2217", "54 .1127", "54.0037", "53.8938", "53.7695", "53.6271", "53.4857", "53.3347", "53.2254", "53.1712", "53.12", '53 .0679 ', '53 .0102', '52 .9126 ', '52 .8148', '52 .7182 ', '52 .6207', '52.491 ', '52 .3561', '52 .2267 ', '52 .0908', '51.9405 ', '51 .7786', '51 .6421 ', '51, 5043', '51, 4063 ', '51 .3 087 ', '51, .2117', '51 .1141 ', '51.0304', '50.9446 ', '50.8577', '50.7744 ', '50.6716', '50.5655 ', '50.4625', '50.3598 ', '50 .2569', '50 .153 ' "50 .0494", "49.9461", "49.8308", "49.7058", "49.582", "49.4583", "49.3473", "49.251", "49 .1533", "49 .0561", "48.953", "48.83", " 48.7064 ', '48 .5812', '48 .4635 ', '48 .3852', '48 .2998 ', '48 .2219', '48 .1428 ', '48.0327' , '47 0,9221' , '47 0,8114' , '47 0,7007' , '47 0,5964' , '47 0,4905' , '47 0,3875' , '47 0,2847' , '47 0,1595' , '47 0,0424' , '46 0,9264' ]}

+0

1. Machst du etwas mit 'm'? 2. "8.05988" ist größer als "59.4627", weil "8" hinter "5" steht, da Sie Strings vergleichen. 3. Soll jede Zeile ein separates Wörterbuch sein? 4. Warum ein Wörterbuch verwenden, wenn die Schlüssel nur ein einfacher Bereich von ganzen Zahlen sind? – TigerhawkT3

+0

1. m ist ein weiterer Satz von Testwerten – Adam

+0

2. Sollte ich float dann vergleichen? 3. Ich mache ein Wörterbuch, und später mache ich eine Reihe von Listen aus den Werten in jedem Schlüssel (hier nicht gezeigt). 4. Ich bin mir nicht sicher ... Ich bin neu in der Codierung. – Adam

Antwort

0

Ich denke, du verkomplizierst das. Denken Sie daran, dass Sie für den Vergleich zuerst die Zeichenfolgen in Floats konvertieren möchten. Außerdem ist es nicht erforderlich, jeden Punkt anhand seines Indexes zu referenzieren. Sie können einfach über das Objekt list direkt iterieren. Wie oben bereits erwähnt, ist es etwas ungewöhnlich, ein Wörterbuch, das durch ganze Zahlen getastet wird, in Betracht zu ziehen, stattdessen eine Liste von Listen zu verwenden.

points = ['9.90203', '9.79947', '9.66876', '9.54503', '9.42167', '9.2977', '9.17321', '9.05162', '8.11487', '8.038', 
      '7.96111', '7.85746', '7.72701', '7.59709', '7.46781', '7.34127', '7.21842', '7.09548', '6.96798', '6.57355', 
      '6.444', '6.32245', '6.23818', '6.15369', '6.04973', '4.63443', '4.49823', '4.36232', '4.21442', '4.0642', 
      '26.5645', '26.4945', '26.4232', '26.3592', '26.2948', '23.418', '23.3667', '23.2756', '23.1856', '22.1849', 
      '22.0822', '22.0191', '21.9671', '21.9154', '21.8641', '20.436', '20.3865', '20.3364', '20.2083', '20.0915', 
      '19.9758', '19.8601', '19.7446', '19.6317', '18.1383', '17.9834', '17.8271', '17.7529', '17.6949', '17.6317', 
      '17.5675', '17.4362', '16.581', '16.4745', '16.378', '16.2562', '16.1471', '16.0222', '15.89', '14.9752', 
      '14.8725', '14.7666', '14.6234', '14.469', '14.3148', '13.7696', '13.6465', '13.5363', '13.4712', '13.4069', 
      '13.3421', '13.2732', '13.1375', '13.0014', '12.4809', '12.3585', '12.2339', '12.121', '12.0116', '11.901', 
      '11.7906', '11.6645', '11.5278', '11.3931', '11.2551', '11.1211', '10.993', '10.8501', '10.7205', '10.6026', 
      '10.4992', '10.3952'] 

data = dict() 
idx = 1 
last_point = float(points[0]) 
subset = [points[0]] 
for point in points[1:]: 
    num_point = float(point) 
    if num_point > last_point: 
     data[idx] = subset 
     subset = [point] 
     idx += 1 
    else: 
     subset.append(point) 
    last_point = num_point 

data[idx] = subset 
+0

Wie würden Sie das wieder in ein Wörterbuch wie in meiner Antwort machen? Es ist genau das, was ich brauche um es zu behalten, damit ich es später so benutzen kann. – Adam

+0

Das ist ein Wörterbuch. Ich habe es nicht geändert. Ich habe nur vorgeschlagen, darüber nachzudenken. – Batman

0

können Sie versuchen, die folgenden:

l = map(float, l) 
results = [[ l[0] ]] 

for i in l[1:]: 
    if i>results[-1][-1]: 
     results.append([i]) 
    else: 
     results[-1].append(i) 

Dies wird Ihnen eine Liste von Listen geben. Wenn Sie wirklich das Wörterbuch möchten, können Sie versuchen:

resultsDict = {i:m for i, m in enumerate(results)} 

oder es ein wenig zu verkürzen:

resultsDict = dict(enumerate(results)) 

mag ich die vorherigen besser, weil es ein wenig mehr lesbar ist ...

Wenn Sie wirklich die Zeichenfolgen beibehalten müssen, können Sie den Vergleich i>results[-1][-1] zu float(i)>float(results[-1][-1]) ändern und die ursprüngliche map loswerden.

Verwandte Themen