问题描述
我们想把多个字典或者映射合并,然后再执行某些操作(如:查找或校验某些 key 是否存在)。
应该如何做呢?
解决方案
使用 collections
模块中的 ChainMap
类。
示例代码:
1 | from collections import ChainMap |
扩展讨论
一个 ChainMap
接受多个字典并将它们在逻辑上变为一个字典。
然后,
这些字典并不是真的合并在一起了, ChainMap
类只是在内部创建了一个容纳这些字典的列表并重新定义了一些常见的字典操作来遍历这个列表。
ChainMap的字典操作
使用 ChainMap 合并后,大部分字典操作都是可以正常使用的。
示例代码:
1 | def test_chainmap_operate(): |
ChainMap
对于编程语言中的作用范围变量(比如 globals
, locals
等)是非常有用的。
ChainMap更多的用法
1 | values = ChainMap() |
update vs ChainMap
也许你可能想使用 update()
合并两个字典。
比如:
1 | 'x': 1, 'z': 3 } a = { |
这样也OK,但它需要你创建一个完全不同的字典对象(或者是破坏现有字典结构)。而且,如原字典做了更新,合并后的新字典并不会同步更新。
比如:
1 | 'x'] = 13 a[ |
而ChainMap
使用的是原来的字典,它不是创建新的字典,所以避免了上面所说的结果。
比如:
1 | 'x': 1, 'z': 3 } a = { |