如何在Python中合并字典?

109 投票
7 回答
137278 浏览
提问于 2025-04-15 22:31
d3 = dict(d1, **d2)

我明白这个操作是把两个字典合并在一起。但是,这样合并后的结果是唯一的吗?如果d1和d2有相同的键,但对应的值不同,那该怎么办呢?我希望d1和d2能够合并,但如果有重复的键,d1的值应该优先。

7 个回答

23

Python 3.9 开始,运算符 | 可以用来创建一个新的字典,这个字典是把两个字典的键和值合并在一起的:

# d1 = { 'a': 1, 'b': 2 }
# d2 = { 'b': 1, 'c': 3 }
d3 = d2 | d1
# d3: {'b': 2, 'c': 3, 'a': 1}

这个操作:

会创建一个新的字典 d3,它包含了 d2 和 d1 的所有键和值。如果 d2 和 d1 有相同的键,那么 d1 的值会优先使用。


另外,还有一个 |= 运算符,它会直接修改 d2,把 d1 的内容合并进来,优先使用 d1 的值:

# d1 = { 'a': 1, 'b': 2 }
# d2 = { 'b': 1, 'c': 3 }
d2 |= d1
# d2: {'b': 2, 'c': 3, 'a': 1}

46

在Python2中,

d1={'a':1,'b':2}
d2={'a':10,'c':3}

d1会覆盖d2:

dict(d2,**d1)
# {'a': 1, 'c': 3, 'b': 2}

d2会覆盖d1:

dict(d1,**d2)
# {'a': 10, 'c': 3, 'b': 2}

这种行为并不是偶然的;文档中有明确说明,可以查阅相关内容

如果一个键同时在位置参数和关键字参数中被指定,那么字典中保留的是关键字参数对应的值。

173

如果你不再需要原来的 d2 字典,可以使用 .update() 方法:

这个方法会用另一个字典里的键值对来更新当前字典,会覆盖掉已有的键。返回值是 None

例如:

>>> d1 = {'a': 1, 'b': 2} 
>>> d2 = {'b': 1, 'c': 3}
>>> d2.update(d1)
>>> d2
{'a': 1, 'c': 3, 'b': 2}

补充:

当然,你可以先复制一份字典,这样就能创建一个新的合并字典。这可能是必要的,也可能不是。如果你的字典里有复合对象(也就是包含其他对象的对象,比如列表或类实例),那么可以考虑使用 copy.deepcopy

撰写回答