2012-03-20 46 views
1

我具有由線的文本文件,如下所示:重複的代碼for循環爲線共享相同的標識符值

12,538123,724026,8.01 
12,538123,724026,8.5 
12,538123,724026,8.91 
34,538123,724026,8.01 
34,538123,724026,8.5 
34,538123,724026,8.91 

我有一個腳本工作該for循環通過數據,需要一個元素[ - 1]並將其累加到新列表中。

我不能解決的是如何做到這一點共享相同的標識符(即第1行和第2行中的12)線組。我嘗試了一個嵌套的while循環,但我的問題是,我的while條件是標識符值本身(即12),所以當我用不同的id(例如34)在新行中讀取時,這會改變條件爲while循環添加新的id值。這(不出意外)導致我在一個長列表中累積每個[-1]值的列表(我的實際列表中有> 200,000行)。我也在For循環中嘗試了一條If語句,它也是這樣做的。

我的問題是使用ID作爲條件,但我想不出另一種方式來做到這一點。

任何想法的人?
它可以在循環中完成嗎?
如果我可以總結可能也會這樣做的線集(但我不知道這是否可以完成)。

+0

我爲你想與您的信息到底該怎麼做有點困惑。我想如果你嘲笑你的while循環的結果應該是什麼,那會很有幫助。 – 2012-03-20 23:18:50

+2

請發佈您的代碼和示例輸出(錯誤/當前和期望)。這樣會更清楚。 – 2012-03-20 23:18:53

+0

我很難理解你的意思 - 你能提供你想要的輸出嗎?另外,你能提供你試過的代碼(你提到的「嵌套的while循環」)嗎? – 2012-03-20 23:19:48

回答

1

未經測試:

from itertools import groupby 
from operator import itemgetter 


d = {} 
with open("some_file_name", "r") as f: 
    lines = (line.split(",") for line in f) 
    for k, g in groupby(lines, key=itemgetter(0)): 
     d[k] = [line[-1] for line in g] 

添加float等需要。結果在d

+0

感謝WH。這看起來像一個不錯的優雅解決方案我想我可以用這個。謝謝! Shaymo – shaymo 2012-03-21 23:30:51

0

您可以使用此代碼:

results = {} 
file = open("filename", "r") 
for line in file.readlines(): 
    val_a, val_b, val_c, val_d = line.split(',') 
    val_d = float(val_d) 
    try: 
     results[val_a] += val_d 
    except KeyError: 
     results[val_a] = val_d 
+0

謝謝里卡多,這看起來不錯(我也很容易理解)。非常感謝。 Shaymo – shaymo 2012-03-21 23:26:44

+0

沒問題的人! – 2012-03-22 14:52:42