如何在Python中优雅地合并两个字典

使用Update函数

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

用字典d2更新字典d1,如果键已经存在,则更新键值。

使用解包操作符**

1
2
3
4
5
6
>>> d1 = {'a': 1, 'b': 2}
>>> d2 = {'c': 3, 'b': 4}
>>> {**d1, **d2}
{'a': 1, 'b': 4, 'c': 3}
>>> {**d2, **d1}
{'c': 3, 'b': 2, 'a': 1}

使用解包操作符**,和update操作一样,后面的字典键会覆盖前面的字典。

使用|操作符

1
2
3
4
5
6
>>> d1 = {'a': 1, 'b': 2}
>>> d2 = {'c': 3, 'b': 4}
>>> d1|d2
{'a': 1, 'b': 4, 'c': 3}
>>> d2|d1
{'c': 3, 'b': 2, 'a': 1}

和使用**操作服相同,合并后创建一个新的字典,后面的字典键覆盖前面的字典键。

使用collections.Chain.Map

ChainMap会创建一个视图,将多个字典合成一个视图,如果修改原始字典,视图也会更新。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
>>> d1 = {'a': 1, 'b': 2}
>>> d2 = {'c': 3, 'b': 4}
>>> from collections import ChainMap
>>> cm = ChainMap(d1, d2)
>>> print(cm)
ChainMap({'a': 1, 'b': 2}, {'c': 3, 'b': 4})
>>> cm['b']
2
>>> d2['b']=10
>>> print(cm)
ChainMap({'a': 1, 'b': 2}, {'c': 3, 'b': 10})
>>> d1['b']=15
>>> print(cm)
ChainMap({'a': 1, 'b': 15}, {'c': 3, 'b': 10})
>>> cm['b']
15
>>> cm['d']=9
>>> print(cm)
ChainMap({'a': 1, 'b': 15, 'd': 9}, {'c': 3, 'b': 10})

从视图中访问键,优先从第一个字典中搜索,搜索按照提供的字典顺序查找。

如果在视图中新增键值,会优先添加到第一个字典中。

修改原始字典(d1, d2)中的键值,视图中对应的字典键也会随之更新。