在Python中"添加"词典?

Roe*_*ler 30 python dictionary

可能重复:
python dict.add_by_value(dict_2)?

我的输入是两个具有字符串键和整数值的字典.我想添加两个字典,以便结果具有输入字典的所有键,并且值是输入字典值的总和.

为清楚起见,如果一个键仅出现在其中一个输入中,则该键/值将出现在结果中,而如果该键出现在两个词典中,则值的总和将出现在结果中.

例如,说我的输入是:

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)

  • +1:很好的单线.但是,我会设置(a).union(b),以便不创建中间集[set(b)]. (2认同)
  • 作为第一个答案,您是否可以更改此建议使用collections.Counter,如"from collections import Counter"然后"dict(Counter(a)+ Counter(b))"? (2认同)

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)

  • 不是单行,但最容易阅读.+1 (6认同)

小智 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)

您可以轻松地将其扩展为更多的词典.