小能豆

如果一个键在两个字典中都出现,则将它们的值相加;如果它只出现在一个字典中,则保留其值

javascript

例如我有两个字典:

Dict A: {'a': 1, 'b': 2, 'c': 3}
Dict B: {'b': 3, 'c': 4, 'd': 5}

我需要一种 Python 风格的方法来“组合”两个字典,其结果如下:

{'a': 1, 'b': 5, 'c': 7, 'd': 5}

也就是说:如果一个键在两个字典中都出现,则将它们的值相加;如果它只出现在一个字典中,则保留其值。


阅读 57

收藏
2024-06-27

共2个答案

小能豆

使用collections.Counter

>>> from collections import Counter
>>> A = Counter({'a':1, 'b':2, 'c':3})
>>> B = Counter({'b':3, 'c':4, 'd':5})
>>> A + B
Counter({'c': 7, 'b': 5, 'd': 5, 'a': 1})

计数器基本上是的子类dict,因此您仍然可以对它们执行通常对该类型执行的所有其他操作,例如迭代它们的键和值。

2024-06-27
小能豆

要以您描述的方式组合两个字典,您可以使用字典理解和操作set来处理键。以下是实现所需结果的 Pythonic 方法:

dict_a = {'a': 1, 'b': 2, 'c': 3}
dict_b = {'b': 3, 'c': 4, 'd': 5}

combined_dict = {key: dict_a.get(key, 0) + dict_b.get(key, 0) for key in set(dict_a) | set(dict_b)}

print(combined_dict)

解释:

  1. 集合并集set(dict_a) | set(dict_b)从两个字典中创建一组所有唯一键。
  2. 字典理解{key: dict_a.get(key, 0) + dict_b.get(key, 0) for key in ...}迭代键并集中的每个键,并将两个字典中的值相加。如果某个键不存在于其中一个字典中,dict.get(key, 0)则返回0

例子:

dict_a = {'a': 1, 'b': 2, 'c': 3}
dict_b = {'b': 3, 'c': 4, 'd': 5}

combined_dict = {key: dict_a.get(key, 0) + dict_b.get(key, 0) for key in set(dict_a) | set(dict_b)}

print(combined_dict)
# Output: {'a': 1, 'b': 5, 'c': 7, 'd': 5}

替代使用collections.defaultdict

另一种方法是使用collections.defaultdict更简洁的方式来处理加法:

from collections import defaultdict

dict_a = {'a': 1, 'b': 2, 'c': 3}
dict_b = {'b': 3, 'c': 4, 'd': 5}

combined_dict = defaultdict(int)

for key, value in dict_a.items():
    combined_dict[key] += value

for key, value in dict_b.items():
    combined_dict[key] += value

print(dict(combined_dict))

解释:

  1. defaultdictdefaultdict(int)创建一个字典,返回0任何缺失的键。
  2. 更新值:循环遍历每个字典并将值添加到defaultdict

例子:

from collections import defaultdict

dict_a = {'a': 1, 'b': 2, 'c': 3}
dict_b = {'b': 3, 'c': 4, 'd': 5}

combined_dict = defaultdict(int)

for key, value in dict_a.items():
    combined_dict[key] += value

for key, value in dict_b.items():
    combined_dict[key] += value

print(dict(combined_dict))
# Output: {'a': 1, 'b': 5, 'c': 7, 'd': 5}

这两种方法都很高效,而且符合 Python 风格,但字典理解方法更简洁。使用适合您的偏好和编码风格的方法。

2024-06-27