合并两个字典并对 Python 中的值求和

目录

Merge two dictionaries and sum the values in Python

  1. 合并两个字典并使用 for 循环对值求和
  2. 合并两个字典并使用字典理解对值求和
  3. 只包括两个字典共有的键值对
  4. 包括来自两个字典的键值对
  5. 合并两个字典并使用 Counter 对值求和

合并两个字典并使用 for 循环对值求和

要合并两个字典并对值求和:

  1. 使用for循环遍历第一个字典的项目。
  2. 检查每个键是否包含在第二个字典中。
  3. 对匹配键的值求和。
主程序
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())

在每次迭代中,我们检查当前键是否包含在第二个字典中。

如果满足条件,我们将两个字典中键的值相加。

合并两个字典并使用字典理解对值求和

这是一个三步过程:

  1. 使用字典理解来迭代其中一个字典。
  2. 在每次迭代中,使用该dict.get()方法对值求和。
  3. 指定一个默认值,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对象,并使用加法 (+) 运算符将它们合并。

额外资源

您可以通过查看以下教程来了解有关相关主题的更多信息: