nic*_*ole 3 python zip dictionary list-comprehension
我有一个任意数量的等长python字典与匹配的键集,如下所示:
{'a':1, 'b':4, 'c':8, 'd':9}
{'a':2, 'b':3, 'c':2, 'd':7}
{'a':0, 'b':1, 'c':3, 'd':4}
...
Run Code Online (Sandbox Code Playgroud)
如何使用相同的键集获取单个字典,但将值作为字典集中相应元素的总和?换句话说,我想要:
{'a':3, 'b':8, 'c':13, 'd':20}
Run Code Online (Sandbox Code Playgroud)
也许有一个丑陋,复杂的循环结构,但有一种更好的方法来做某些列表/字典理解聪明吗?想想看,我真的不确定如何制作一个丑陋的循环版本,无论如何..
Tim*_*ers 16
collections.Counter() 救援;-)
from collections import Counter
dicts = [{'a':1, 'b':4, 'c':8, 'd':9},
{'a':2, 'b':3, 'c':2, 'd':7},
{'a':0, 'b':1, 'c':3, 'd':4}]
c = Counter()
for d in dicts:
c.update(d)
Run Code Online (Sandbox Code Playgroud)
然后:
>>> print c
Counter({'d': 20, 'c': 13, 'b': 8, 'a': 3})
Run Code Online (Sandbox Code Playgroud)
或者你可以把它改回dict:
>>> print dict(c)
{'a': 3, 'c': 13, 'b': 8, 'd': 20}
Run Code Online (Sandbox Code Playgroud)
Counter()所有输入词都是否具有相同的键并不重要.如果你肯定知道他们这样做,你可以尝试荒谬;-)这样的单行:
d = {k: v for k in dicts[0] for v in [sum(d[k] for d in dicts)]}
Run Code Online (Sandbox Code Playgroud)
Counter()更清晰,更快速,更灵活.公平地说,这个稍微不那么荒谬的单行内容就不那么荒谬了:
d = {k: sum(d[k] for d in dicts) for k in dicts[0]}
Run Code Online (Sandbox Code Playgroud)
如果你只是想dict只使用,你可以使用这个
dicts = [{'a':0, 'b':4, 'c':8, 'd':9},
{'a':0, 'b':3, 'c':2, 'd':7},
{'a':0, 'b':1, 'c':3, 'd':4}]
result = {}
for myDict in dicts:
for key, value in myDict.items():
result.setdefault(key, 0)
result[key] += value
print result
Run Code Online (Sandbox Code Playgroud)
输出:
{'a': 0, 'c': 13, 'b': 8, 'd': 20}
Run Code Online (Sandbox Code Playgroud)