2017-02-27 1 views
1

小さなサブリストにしようとしている大きなCSVファイルがあります。このコードはなぜ機能しないのですか?私は値を分離する必要がありますか?

唯一の問題は、どうあるべきかをやって...または非常に少なくとも、唯一のいくつかのものが正しくされて

私の問題を分離してデータを適切に分離されていないことです。私は、データを持っているCSVファイルを持っていますそれは90〜3メートルの深さにあり、そのデータはそのように前後に移動します。私は最新のPythonを使用しています。

数値が再び増加するたびに、分けたいと思います。

ex。 (深さ)88,77,50,20,5,90,76,54,34,15,8,4,81,74,62,51,49,30,22,10,8 ...など。それは90から3の間を続きます。

私がしたいことは、90と3の間でデータを分割することです。分割されたら、そのリストの最後と最初の値を取得します。そう前例のように。 90,76,54,34,15,8,4(ここでは分離しています)81,74,62,51,49,30,22,10,8ここでは、 )... 等々。ここ

は私のコードである:ここ

#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) 

は私の出力である:

{ '1':[ '8.18142'、 '8.11846'、 '8.05988'、'59 0.4627' 、 ' 「59 .4596」、「58 .4541」、「58 .3302」、「58 .2239」、「58 .0314」、「57。9405」、「57 .8496」、「57.7514」、「57.6746」、「57.6098」、「57.55414」、 「56」、「56」、「56」、「56」、「56」、「56」、「56」、「56」、「56」、「56」、「56」、「56 .0877」、「57」、「57」、 「55.788」、「55.0009」、「55.0009」、「55.6059」、「55.9494」、「55.3858」、「55.2761」、「55.1612」、「55.0097」、「54.87」 「53」、「53。7695」、「53 .6271」、「53。4857」、および「54.757」のうちの少なくとも1つを含む、 「52」、「52」、「52」、「52」、「52」、「52,618」、「52,6207」、「52.491」、「52.3561」、 「52.2267」、「52.0908」、「51.9405」、「51.7786」、「51.6421」、「51.4043」、「51.4063」、「51.3087」、「51.2117」、「51.1141」、「51.0304」、「.9446」、「.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 ' 「47 .0327」、「47.9221」、「47。8114」、「47.7007」、「47。5964」、「47。4905」、「47。3875」、「47 .2847」、「47 .1595」、「47 .0424」、「46 .9264」〕}

私の所望の出力:

{ '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 .6746 '、'57 .6098'、'57 .5414 '、'57 .4722'、'57 .3517 '、'57 .2151 「56 .9704」、「56。9704」、「56 .8361」、「56 .6993」、「56 .564」、「56 .4287」、「56.3106」、「56.2」、「56.0877」、「55.9782」、「55.8869」、「55.823」、 '55 .7578 '、'55 .6933'、'55 .605 '、'55.4949'、'55 .3858 '、'55 .2712'、'55 .0097 '、'54 .8786'、'54 .7385 '、'54 .6315'、'54 .5282 '、'54 .4292 '、'54 .327'、'54 .2217 '、'54 .1127'、'54 .0037 '、'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.77786'、'51.6221 '、'51 .5043'、'51 .4063 '、'51 .3 「50」、「49」、「50。 「49.9461」、「49.9461」、「49.8308」、「49.7058」、「49.558」、「49.4583」、「49.33473」、「49.2525」、「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.「m」で何かしていますか? 2.文字列を比較しているので、 '' 8.05988 'は ''59 .4627' 'より大きくなります.''5'の後に '' 8 ''が来るためです。 3.各行は別の辞書になっていますか? 4.キーが単純な整数の範囲である場合、辞書を使う理由は何ですか? – TigerhawkT3

+0

1. mは別のテスト値のセットです – Adam

+0

2.浮動小数点を比較する必要がありますか? 3.辞書を作ってから、後で各キーの値からリストを作ります(ここには表示されていません)。 4.私は確信していません...私は新しいコーディングです。 – Adam

答えて

0

私はあなたがこれを過度に複雑にしていると思う。比較を行うには、まず文字列を浮動小数点数に変換したいと思います。また、インデックスごとに各ポイントを参照する必要はありません。 listオブジェクトを直接反復することができます。 また、上で指摘したように、整数でキー入力された辞書を持つのは少し珍しいです。代わりにリストのリストを使うことを検討してください。

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

どうすればそれを私の答えのような辞書に戻すことができますか?それは私がそれを保つために必要なものなので、後でそれを使うことができます。 – Adam

+0

これは辞書です。私はそれを変えなかった。私はちょうどあなたがそれについて考えることを提案しました。 – Batman

0

あなたは次のことを試すことができます。

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) 

これはあなたのリストのリストを与えるために起こっています。あなたが本当に辞書をしたい場合は、試すことができます:

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

またはそれを少し短くする:それはもう少し読みやすいので

resultsDict = dict(enumerate(results)) 

私はより良い前のものが好きなの...

実際に文字列を保持する必要がある場合は、比較i>results[-1][-1]float(i)>float(results[-1][-1])に変更し、最初にmapを取り除くことができます。

関連する問題