上QQ阅读APP看书,第一时间看更新
2.3.11 将多个映射合并为单个映射
如果在Python程序中有多个字典或映射,想要在逻辑上将它们合并为一个单独的映射结构,并且以此执行某些特定的操作,例如查找某个值或检查某个键是否存在,可以考虑将多个映射合并为单个映射。下面的实例文件hebing.py演示了将多个映射合并为单个映射的过程。
源码路径:daima\第2章\hebing.py
①a = {'x': 1, 'z': 3 } b = {'y': 2, 'z': 4 } from collections import ChainMap c = ChainMap(a,b) print(c['x']) # Outputs 1 (from a) print(c['y']) # Outputs 2 (from b) ②print(c['z']) # Outputs 3 (from a) ③print(len(c)) print(list(c.keys())) ④print(list(c.values())) ⑤c['z'] = 10 c['w'] = 40 del c['x'] ⑥print(a)
①~②在执行查找操作之前必须先检查这两个字典(例如,先在a中查找,如果没找到,再去b中查找)。在上述代码中演示了一种非常简单的方法,就是利用collections模块中的ChainMap来解决这个问题。
ChainMap可以接收多个映射,这样可在逻辑上让它们表现为一个单独的映射结构。但是这些映射在字面上并不会合并在一起。相反,ChainMap只是简单地维护一个记录底层映射关系的列表,然后重定义常见的字典操作来扫描这个列表。③~④演示了这个特性。
在⑤~⑥中,如果有重复的键,那么将会采用第一个映射中对应的值。所以上述代码中的c['z']总是引用字典a中的值,而不是引用字典b中的值。实现修改映射的操作总会作用在列出的第一个映射结构上。
执行结果如图2-27所示。
图2-27 执行结果