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 执行结果