如何组合多个dicts,在Python中对常用键的值进行求和(并保留值为0的值)?

时间:2015-07-05 01:06:42

标签: python python-2.7 dictionary iteration defaultdict

给出三个词组d1,d2和d3:

D1

{'a':1,'b':2,'c':3, 'd':0)

D2

{'b':76}

D3

{'a': 45, 'c':0}

有一些关键名称对于多个dict是通用的(实际上,它们将代表相同的现实对象)。其他如“' d'在d1中仅存在于d2中。我想将所有dicts组合在一起,首先将公共密钥的值加起来,最后用:

{'a':46, 'b':78, 'c':3, 'd': 0}

如果每个dict的大小相同并且包含相同的键,我可以执行以下操作:

summedAndCombined = {}
    for k,v in d1.items():
        summedAndCombined[k] = d1[k]+d2[k]+d3[k]

但是一旦达到d1中的键而不是其他键,它就会崩溃。我们如何实现这一目标?

更新

不重复。 collections.Counter 几乎有效,但如果密钥d的值为零,则结果计数器中缺少密钥 d

In [128]: d1 = {'a':1,'b':2,'c':3, 'd':0}

In [129]: d2 = {'b':76}

In [130]: d3 = {'a': 45, 'c':0}

In [131]: from collections import Counter

In [132]: Counter(d1) + Counter(d2) + Counter(d3)
Out[132]: Counter({'b': 78, 'a': 46, 'c': 3})

3 个答案:

答案 0 :(得分:2)

如果您希望0键保持不变,则可以使用update代替+ Counter

>>> c = Counter()
>>> for d in d1, d2, d3:
...     c.update(d)
...     
>>> c
Counter({'b': 78, 'a': 46, 'c': 3, 'd': 0})

(这可能是一个副本,但我现在找不到它。)

答案 1 :(得分:1)

UNTESTED:

def merge_dicts(*dicts):
    res = {}
    for key in set(sum(map(list, dicts), [])):
        res[key] = 0
        for dct in dicts:
            res[key] += dct.get(key, 0)
    return res

使用示例:

merge_dicts(d1, d2, d3)

答案 2 :(得分:1)

collections.defaultdict救援

import collections
d = collections.defaultdict(int)
for thing in [d1, d2, d3]:
    for k, v in thing.items():
        d[k] += v