collections.ChainMap

ChainMap3.3 版本中的新功能 ****

给出一些 maps 返回一个新的 ChainMap 对象。此对象将多个 dicts 或其他映射组合在一起以创建单个可更新视图。

ChainMaps 可用于管理嵌套上下文和叠加层。在 Django 模板引擎中的 Context 类的实现中可以找到 python 世界中的一个例子。它可用于快速链接多个映射,以便将结果视为一个单元。它通常比创建新词典和运行多个 update() 调用快得多。

只要有一个查找值链,就可以有 ChainMap 的情况。示例包括同时具有用户指定的值和默认值的字典。另一个例子是在 web 使用中发现的 POSTGET 参数映射,例如 Django 或 Flask。通过使用 ChainMap,可以返回两个不同字典的组合视图。

maps 参数列表从第一次搜索到最后搜索排序。查找会连续搜索基础映射,直到找到密钥。相反,写入,更新和删除仅对第一个映射进行操作。

import collections

# define two dictionaries with at least some keys overlapping.
dict1 = {'apple': 1, 'banana': 2}
dict2 = {'coconut': 1, 'date': 1, 'apple': 3}

# create two ChainMaps with different ordering of those dicts.
combined_dict = collections.ChainMap(dict1, dict2)
reverse_ordered_dict = collections.ChainMap(dict2, dict1)

请注意在后续查找中首先找到值的顺序的影响

for k, v in combined_dict.items():
    print(k, v)
    
date 1
apple 1
banana 2
coconut 1

for k, v in reverse_ordered_dict.items():
    print(k, v)

date 1
apple 3
banana 2
coconut 1