如何在 Python 中合并字典?

2023-09-21 23:31:35

dictionary in Python是键值对的无序集合,键是唯一的,并且没有追加操作。如果某个键在字典表示形式中重复出现,则仅保留最后一次出现,如下所示。

>>> d1={"A1":20, "B1":30, "C1":40, "B1":25, "D1":50}
>>> d1
{'A1': 20, 'B1': 25, 'C1': 40, 'D1': 50}

此特征用于将一个字典的键值对合并到另一个字典中。在以下示例中,在循环访问items()集合时,如果其键存在于 other 中,则将更新其值,否则将添加新对。

d1={'A1': 20, 'B1': 25, 'C1': 40, 'D1': 50}
d2={"X1":100, "Y1":200, "b1":25, "A1":22,"D1":"Hello"}
for k,v in d2.items():
    d1[k]=v
print(d1)

输出:

{'A1': 22, 'B1': 25, 'C1': 40, 'D1': 'Hello', 'X1': 100, 'Y1': 200, 'b1': 25}

使用 dict.update() 合并词典(Merge Dictionaries using dict.update())

这是一种将字典与另一个字典合并的显式技术。同样适用于dict类的update()方法。

>>> d1={'A1': 20, 'B1': 25, 'C1': 40, 'D1': 50}
>>> d2={"X1":100, "Y1":200, "b1":25, "A1":22,"D1":"Hello"}
>>> d1.update(d2)
>>> d1
{'A1': 22, 'B1': 25, 'C1': 40, 'D1': 'Hello', 'X1': 100, 'Y1': 200, 'b1': 25}

使用解包运算符合并字典(Merge Dictionaries using Unpacking Operator)

还可以使用解包运算符 (**) 合并字典。它是一个一元运算符,将 dict 对象作为操作数。 它将每个 k-v 对添加到空字典中。显然,如果第二个字典也被解压缩,则现有键的值将被更新。

>>> d1={'A1': 20, 'B1': 25, 'C1': 40, 'D1': 50}
>>> d2={"X1":100, "Y1":200, "b1":25, "A1":22,"D1":"Hello"}
>>> d3={**d1, **d2}
>>> d3
{'A1': 22, 'B1': 25, 'C1': 40, 'D1': 'Hello', 'X1': 100, 'Y1': 200, 'b1': 25}

使用 ChainMap() 合并字典(Merge Dictionaries using ChainMap())

合并字典的另一种方法是在 collections module 中使用 ChainMap() 函数。ChainMap对象是一个类似字典的对象,它创建多个字典的单个视图。

>>> from collections import ChainMap
>>> d1={'A1': 20, 'B1': 25, 'C1': 40, 'D1': 50}
>>> d2={"X1":100, "Y1":200, "b1":25, "A1":22,"D1":"Hello"}
>>> map=ChainMap(d2,d1)
>>> map
ChainMap({'X1': 100, 'Y1': 200, 'b1': 25, 'A1': 22, 'D1': 'Hello'}, {'A1': 20, 'B1': 25, 'C1': 40, 'D1': 50})
>>> dict(map)
{'A1': 22, 'B1': 25, 'C1': 40, 'D1': 'Hello', 'X1': 100, 'Y1': 200, 'b1': 25}

使用联合运算符合并字典(Merge Dictionaries using Union Operator)

最后,我们将看看 Python 3.9 中引入的联合运算符 ( | )。此运算符处理两个 dict 对象操作数并返回合并的字典。

>>> d1={'A1': 20, 'B1': 25, 'C1': 40, 'D1': 50}
>>> d2={"X1":100, "Y1":200, "b1":25, "A1":22,"D1":"Hello"}
>>> d1 | d2
{'A1': 22, 'B1': 25, 'C1': 40, 'D1': 'Hello', 'X1': 100, 'Y1': 200, 'b1': 25}

此版本中还引入了就地更新运算符 (|=)。与联合运算符不同,这不会创建新的字典并更新左侧的字典操作数。


本文内容总结: