Roe*_*ler 30 python dictionary
我的输入是两个具有字符串键和整数值的字典.我想添加两个字典,以便结果具有输入字典的所有键,并且值是输入字典值的总和.
为清楚起见,如果一个键仅出现在其中一个输入中,则该键/值将出现在结果中,而如果该键出现在两个词典中,则值的总和将出现在结果中.
例如,说我的输入是:
a = dict()
a['cat'] = 1
a['fish'] = 10
a['aardvark'] = 1000
b = dict()
b['cat'] = 2
b['dog'] = 200
b['aardvark'] = 2000
Run Code Online (Sandbox Code Playgroud)
我希望结果如下:
{'cat': 3, 'fish': 10, 'dog': 200, 'aardvark': 3000}
Run Code Online (Sandbox Code Playgroud)
知道Python必须有一个单行来完成这个(它不一定是一行......).有什么想法吗?
Jue*_*gen 51
那个怎么样:
dict( [ (n, a.get(n, 0)+b.get(n, 0)) for n in set(a)|set(b) ] )
Run Code Online (Sandbox Code Playgroud)
或者没有创建中间列表(生成器就足够了):
dict( (n, a.get(n, 0)+b.get(n, 0)) for n in set(a)|set(b) )
Run Code Online (Sandbox Code Playgroud)
Post Scriptum:
正如评论员正确解决的那样,有一种方法可以使用new(来自Py2.7)collections.Counter类来实现这一点.我记得很多,当我写下答案时,这个版本不可用:
from collections import Counter
dict(Counter(a)+Counter(b))
Run Code Online (Sandbox Code Playgroud)
Adr*_*iuk 15
结果是a:
for elem in b:
a[elem] = a.get(elem, 0) + b[elem]
Run Code Online (Sandbox Code Playgroud)
结果是c:
c = dict(a)
for elem in b:
c[elem] = a.get(elem, 0) + b[elem]
Run Code Online (Sandbox Code Playgroud)
小智 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
Run Code Online (Sandbox Code Playgroud)
您可以轻松地将其扩展为更多的词典.