如何在Python中合并字典?
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
。