目录
Merge two dictionaries and sum the values in Python
合并两个字典并使用 for 循环对值求和
要合并两个字典并对值求和:
- 使用
for
循环遍历第一个字典的项目。 - 检查每个键是否包含在第二个字典中。
- 对匹配键的值求和。
dict_1 = {'a': 1, 'b': 2, 'c': 3, 'x': 999} dict_2 = {'a': 100, 'b': 100, 'c': 100, 'y': 333} new_dict = {} for key, value in dict_1.items(): if key in dict_2: new_dict[key] = value + dict_2[key] else: new_dict[key] = value print(new_dict) # 👉️ {'a': 101, 'b': 102, 'c': 103, 'x': 999}
我们使用for 循环迭代第一个字典的项目。
dict.items
方法返回字典项((键,值)对)的新视图。
my_dict = {'id': 1, 'name': 'BobbyHadz'} # 👇️ dict_items([('id', 1), ('name', 'BobbyHadz')]) print(my_dict.items())
在每次迭代中,我们检查当前键是否包含在第二个字典中。
如果满足条件,我们将两个字典中键的值相加。
合并两个字典并使用字典理解对值求和
这是一个三步过程:
- 使用字典理解来迭代其中一个字典。
- 在每次迭代中,使用该
dict.get()
方法对值求和。 - 指定一个默认值,
0
以防一个字典中的键在另一个字典中不存在。
dict_1 = {'a': 1, 'b': 2, 'c': 3, 'x': 999} dict_2 = {'a': 100, 'b': 100, 'c': 100, 'y': 333} # ✅ merge dictionaries and sum key-value pairs # (includes key-value pairs from dict_1 that are not in dict_2) result = { key: dict_1.get(key, 0) + dict_2.get(key, 0) for key in dict_1 } # 👇️ {'c': 103, 'x': 999, 'a': 101, 'b': 102} print(result)
代码示例使用字典理解
来遍历字典。
Dict comprehensions 与list comprehensions非常相似
。
该示例合并了两个字典并对相应键的值求和。
dict_1 = {'a': 1, 'b': 2, 'c': 3, 'x': 999} dict_2 = {'a': 100, 'b': 100, 'c': 100, 'y': 333} result_1 = { key: dict_1.get(key, 0) + dict_2.get(key, 0) for key in dict_1 } # 👇️ {'c': 103, 'x': 999, 'a': 101, 'b': 102} print(result_1)
因为我们只迭代dict_1
,所以我们从 得到所有的键值对
dict_1
。
但是,请注意我们没有dict_2
以任何方式进行迭代,因此y
结果中不包含键。
我们使用该dict.get()
方法访问每个字典中的特定键。
如果键在字典中,则 dict.get 方法返回给定键的值,否则返回默认值。
该方法采用以下 2 个参数:
姓名 | 描述 |
---|---|
钥匙 | 返回值的键 |
默认 | 如果字典中不存在提供的键,则返回默认值(可选) |
default
如果未提供参数值,则默认为None
,因此该get()
方法永远不会引发KeyError
.
只包括两个字典共有的键值对
如果您需要合并字典,对键值对求和并且仅包括两个字典共有的键值对,请使用两个set
对象的交集。
dict_1 = {'a': 1, 'b': 2, 'c': 3, 'x': 999} dict_2 = {'a': 100, 'b': 100, 'c': 100, 'y': 333} result = { key: dict_1.get(key, 0) + dict_2.get(key, 0) for key in set(dict_1) & set(dict_2) } # 👇️ {'b': 102, 'c': 103, 'a': 101} print(result)
我们使用set()类将字典转换为set
对象。
集合对象是唯一元素的无序集合。
dict_1 = {'a': 1, 'b': 2, 'c': 3, 'x': 999} dict_2 = {'a': 100, 'b': 100, 'c': 100, 'y': 333} # 👇️ {'x', 'a', 'c', 'b'} print(set(dict_1)) # 👇️ {'y', 'a', 'c', 'b'} print(set(dict_2)) # 👇️ {'a', 'c', 'b'} print(set(dict_1) & set(dict_2))
&
返回一个新集合,其中包含两个set
对象共有的元素(交集)。结果是一个字典,它只包含两个字典中都存在的键值对。
包括来自两个字典的键值对
如果您需要合并字典、对键值对求和并包含任一字典中存在的键值对,请使用具有两个
set
对象的联合。
dict_1 = {'a': 1, 'b': 2, 'c': 3, 'x': 999} dict_2 = {'a': 100, 'b': 100, 'c': 100, 'y': 333} result = { key: dict_1.get(key, 0) + dict_2.get(key, 0) for key in set(dict_1) | set(dict_2) } # 👇️ {'a': 101, 'b': 102, 'x': 999, 'y': 333, 'c': 103} print(result)
管道|
返回一个新的set
,其中包含来自两个对象的元素set
。
dict_1 = {'a': 1, 'b': 2, 'c': 3, 'x': 999} dict_2 = {'a': 100, 'b': 100, 'c': 100, 'y': 333} # 👇️ {'b', 'a', 'y', 'x', 'c'} print(set(dict_1) | set(dict_2))
结果是一个字典,其中包含存在于任一dict
.
合并两个字典并使用 Counter 对值求和
您还可以使用模块Counter
中的类collections
来合并和求和两个字典。
from collections import Counter dict_1 = {'a': 1, 'b': 2, 'c': 3, 'x': 999} dict_2 = {'a': 100, 'b': 100, 'c': 100, 'y': 333} new_dict = Counter(dict_1) + Counter(dict_2) # Counter({'x': 999, 'y': 333, 'c': 103, 'b': 102, 'a': 101}) print(new_dict) print(new_dict['x']) # 👉️ 999 print(new_dict['y']) # 👉️ 333
模块中的 Counter
类是
collections
该类的子类dict
。
该类基本上是键数对的映射。
我们使用类将两个字典转换为Counter
对象,并使用加法 (+) 运算符将它们合并。
额外资源
您可以通过查看以下教程来了解有关相关主题的更多信息: