如何将多个类型的字典结合起来,对共同键的值(并保留那些具有值为0)在Python?(How to c

2019-10-23 15:57发布

鉴于3路类型的字典D1,D2和D3:

D1

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

D2

{'b':76}

D3

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

有迹象表明,通用于多个字典一些关键的名称(在现实中,他们将代表相同的真实对象)。 其他如在D1“d”只存在于D2。 我希望将所有类型的字典一起, 首先先总结了常见的键的值,以结束了:

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

如果每个字典大小相同并且包含相同的键,我可以这样做:

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

但是,这会尽快到达一个关键是在D1,但不是在别人打破。 我们如何实现这一目标?

UPDATE

不是重复。 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})

Answer 1:

你可以使用update的,而不是+Counter ,如果你想在0键坚持:

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

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



Answer 2:

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)


Answer 3:

collections.defaultdict救援

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


文章来源: How to combine multiple dicts, summing the values of common keys (and retaining those with value 0) in Python?