问题
现在有多个字典或者映射,你想将它们从逻辑上合并为一个单一的映射后执行某些操作, 比如查找值或者检查某些键是否存在。
解决方案
假如你有如下两个字典:
a = {'x': 1, 'z': 3} b = {'y': 2, 'z': 4}
一:update 将两个字典合并
# 不改变原字典,新建c合并后的字典 c =dict(a) c.update(b) print(c) # {'x': 1, 'z': 4, 'y': 2} # 更新原字典,更新的内容会覆盖老的内容 a.update(b) print(a) # {'x': 1, 'z': 4, 'y': 2}
update 缺点:但是它需要你创建一个完全不同的字典对象(或者是破坏现有字典结构)。 同时,如果原字典做了更新,这种改变不会反应到新的合并字典中去。
二: ChainMap 在内部创建了一个容纳这些字典的列表 并重新定义了一些常见的字典操作来遍历这个列表。大部分字典操作都是可以正常使用的
from collections import ChainMap d=ChainMap(a,b) print(d) # ChainMap({'x': 1, 'z': 3}, {'y': 2, 'z': 4}) print(list(d.keys())) # ['y', 'x', 'z'] 顺序乱了,不准 print(list(d.values())) # [2, 3, 1] 顺序乱了,不准 print(d["z"]) # 出现重复键,那么第一次出现的映射值会被返回。 因此,例子程序中的 c['z'] 总是会返回字典 a 中对应的值,而不是 b 中对应的值