2012-02-12 55 views
1

列表我有一個文件,例如:辭典值

a 1 
a 2 
b 5 
c 8 
a 9 

我想,這樣我有一個總數,因此一個單一的鍵一起添加每個鍵的第二個字段:值對。

對於大數據集,我認爲最好的方法是創建一個包含每個唯一鍵的值列表的字典。這是最好的方法嗎?

如何準確地設置每個鍵的值列表(下面的代碼似乎覆蓋值而不是附加)?

dict={} 
file=open('foo.txt','r') 
lines=file.readlines() 
for line in lines: 
     k, v=line.split() 
     dict[k]=[v] 

現在,如果我想利用填充在第一字典中的總人數和另一個字典,以確定兩者之間的差異比較這兩個按鍵和對鍵和值的值,我只能得出類似下面的:

對於i在res.keys():

if res2.get(i): 
    print 'match',i 
else: 
    print i,'does not match' 

對於i在res2.keys():

if res.get(i): 
    print 'match',i 
else: 
    print i,'does not match' 
在res.values()3210

對於我:

if res2.get(i): 
    print 'match',i 
else: 
    print i,'does not match' 

因爲我在res2.values():

if res.get(i): 
    print 'match',i 
else: 
    print i,'does not match' 

累贅和馬車...需要幫助!

回答

1

這正是setdefault()是:

d = {} 
with open('foo.txt','r') as f: 
    for line in f: 
     k,v = line.split() 
     d.setdefault(k, []).append(v) 

另外,不要使用dict作爲變量名。你可以直接在文件上迭代;這裏不需要使用.readlines()

4

如果你只是想要一個總計,你不需要創建list追加元素。您可以使用defaultdict並繼續添加以獲得總計。

from collections import defaultdict 
key_totals = defaultdict(int) 
with open('foo.txt', 'r') as f: 
    for line in f: 
     k, v = line.split() 
     key_totals[k] += int(v) 
7

使用defaultdict計算的金額:

from collections import defaultdict 
res = defaultdict(int) 
with open('foo.txt', 'r') as f: 
    for line in f: 
    k,v = line.split() 
    res[k] += int(v) 
# res is now {"a": 12, "b": 5, "c": 8} 

如果你不想的款項,但元素的列表,修改到:

from collections import defaultdict 
res = defaultdict(list) 
with open('foo.txt', 'r') as f: 
    for line in f: 
    k,v = line.split() 
    res[k].append(v) 
# res is now ["a": ["1", "2", "9"], "b": ["5"], "c": ["8"]] 

注意,我改變了一些變量名,值得注意的是filefdictres。這是因爲filedict是內置的名稱,因此應該避免使用變量名稱以避免混淆。

另外,readlines是沒有必要的;你可以直接迭代該文件。

此外,with語句確保文件後來被關閉。

+0

真棒... thx的幫助! – NewToPy 2012-02-12 22:01:05

+0

如果這個(或其他答案)解決了你的問題,請考慮[接受它](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)。 – phihag 2012-02-12 22:48:34

+0

將res [k] .append(v)工作,如果我有多個變量,我想追加?即。 k,field1,field2,field3,field4 = line.split()res [k] .append(field1,field2,field3,field4) – NewToPy 2012-02-15 04:42:55