2009-06-23 94 views
28

可能重複:
python dict.add_by_value(dict_2) ?「在Python中添加」字典?

我輸入的是,有字符串鍵和整數值兩個字典。我想添加兩個字典,以便結果具有輸入字典的所有鍵,並且這些值是輸入字典值的總和。

爲了清楚起見,如果一個鍵只出現在其中一個輸入中,該鍵/值將出現在結果中,而如果該鍵出現在兩個詞典中,則值的總和將出現在結果中。

例如,假設我輸入的是:

a = dict() 
a['cat'] = 1 
a['fish'] = 10 
a['aardvark'] = 1000 

b = dict() 
b['cat'] = 2 
b['dog'] = 200 
b['aardvark'] = 2000 

我想結果是:

{'cat': 3, 'fish': 10, 'dog': 200, 'aardvark': 3000} 

知的Python必須有一個班輪完成這件事(它不真的不得不是一條線......)。有什麼想法嗎?

+1

的問題是重複的,答案是不;-) – Juergen 2009-06-23 09:02:46

+0

@msanders:其實這不是一個重複的,你指的是所需要的所有字典的問題具有完全相同的鍵 – 2009-06-23 09:09:52

回答

50

怎麼樣:

dict([ (n, a.get(n, 0)+b.get(n, 0)) for n in set(a)|set(b) ]) 

或者沒有創建中間表(發電機就夠了):

dict((n, a.get(n, 0)+b.get(n, 0)) for n in set(a)|set(b)) 

郵政Scriptum:

作爲一個評論員正確解決,有落實,隨着新的(從Py2.7)collections.Counter類更輕鬆的方式。儘可能多的記得,這個版本是不可用時,我寫了答案:

from collections import Counter 
dict(Counter(a)+Counter(b)) 
15

結果a

for elem in b: 
    a[elem] = a.get(elem, 0) + b[elem] 

結果c

c = dict(a) 
for elem in b: 
    c[elem] = a.get(elem, 0) + b[elem] 
+1

這兩條線BTW :) – Aamir 2009-06-23 08:06:50

+6

不是一句話,但最容易閱讀。 +1 – 2009-06-23 08:18:33

15

不在同一行,但...

import itertools 
import collections 
a = dict() 
a['cat'] = 1 
a['fish'] = 10 
a['aardvark'] = 1000 
b = dict() 
b['cat'] = 2 
b['dog'] = 200 
b['aardvark'] = 2000 
c = collections.defaultdict(int) 
for k, v in itertools.chain(a.iteritems(), b.iteritems()): 
    c[k] += v 

您可以輕鬆地將其擴展到詞典的數量較多。

4

一個班輪(按要求排序):獲取鑰匙列表,添加它們,放棄重複項,用列表理解迭代結果,如果鑰匙在兩個字符串中,則返回(鍵,值)個別價值,如果沒有。包裝在字典中。

>>> dict([(x,a[x]+b[x]) if (x in a and x in b) else (x,a[x]) if (x in a) else (x,b[x]) for x in set(a.keys()+b.keys())]) 
{'aardvark': 3000, 'fish': 10, 'dog': 200, 'cat': 3}