2009-06-23 93 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}