从两个字典中添加值

12
dict1 = {a: 5, b: 7}
dict2 = {a: 3, c: 1}

result {a:8, b:7, c:1}

我该怎么获得结果?


6个回答

25

这是一个能够完成此操作的一行代码:

dict1 = {'a': 5, 'b': 7}
dict2 = {'a': 3, 'c': 1}

result = {key: dict1.get(key, 0) + dict2.get(key, 0)
          for key in set(dict1) | set(dict2)}
# {'c': 1, 'b': 7, 'a': 8}

请注意,set(dict1) | set(dict2)是您两个字典中所有键的集合。而dict1.get(key, 0)则是如果该键存在,则返回dict1[key],否则返回0


这仅适用于较新版本的Python:

{k: dict1.get(k, 0) + dict2.get(k, 0) for k in dict1.keys() | dict2.keys()}

16
你可以使用实现了加法 +collections.Counter
>>> from collections import Counter
>>> dict1 = Counter({'a': 5, 'b': 7})
>>> dict2 = Counter({'a': 3, 'c': 1})
>>> dict1 + dict2
Counter({'a': 8, 'b': 7, 'c': 1})

如果你真的想要将结果作为字典返回,随后你可以将其转换回去:

>>> dict(dict1 + dict2)
{'a': 8, 'b': 7, 'c': 1}

2
这个实现有问题,它没有计算值为零的数。 - Espoir Murhabazi
实际上它只保留正数值,即 Counter(a=0, b=1) + Counter(b=-2) == Counter() (在此处 + 给出一个空计数器)。 - a_guest

1

认为这很简单。

a={'a':3, 'b':5}

b= {'a':4, 'b':7}

{i:a[i]+b[i] for i in a.keys()}

输出:{'a': 7, 'b': 12}


0

这里有一个不错的函数:

def merge_dictionaries(dict1, dict2):
    merged_dictionary = {}

    for key in dict1:
        if key in dict2:
            new_value = dict1[key] + dict2[key]
        else:
            new_value = dict1[key]

        merged_dictionary[key] = new_value

    for key in dict2:
        if key not in merged_dictionary:
            merged_dictionary[key] = dict2[key]

    return merged_dictionary

通过编写:

dict1 = {'a': 5, 'b': 7}
dict2 = {'a': 3, 'c': 1}
result = merge_dictionaries(dict1, dict2)

结果将是:

{'a': 8, 'b': 7, 'c': 1}

0
Here is another approach but it is quite lengthy!

d1 = {'a': 5, 'b': 7}
d2 = {'a': 3, 'c': 1}

d={}
for i,j in d1.items():
    for k,l in d2.items():
        if i==k:
            c={i:j+l}
            d.update(c)
for i,j in d1.items():
    if i not in d:
        d.update({i:j})
for m,n in d2.items():
    if m not in d:
        d.update({m:n})

0
一个快速的字典推导式,适用于任何接受+运算符的类。性能可能不是最优的。
{
    **dict1,
    **{ k:(dict1[k]+v if k in dict1 else v)
        for k,v in dict2.items() }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接