algN/test/collections/ChainMap.py

56 lines
2.8 KiB
Python
Raw Normal View History

2025-08-23 10:12:26 +08:00
"""
1ChainMap是什么
ChainMap最基本的使用可以用来合并两个或者更多个字典当查询的时候从前往后依次查询
ChainMap将多个字典视为一个解锁Python超能力
ChainMap是由Python标准库提供的一种数据结构允许你将多个字典视为一个换句话说:ChainMap是一个基于多dict的可更新的视图它的行为就像一个普通的dict
ChainMap类用于快速链接多个映射以便将它们视为一个单元它通常比创建新字典和多次调用update()快得多
你以前可能从来没有听说过ChainMap你可能会认为ChainMap的使用情况是非常特定的坦率地说你是对的
我知道的用例包括
通过多个字典搜索
提供链缺省值
经常计算字典子集的性能关键的应用程序
2特性
1找到一个就不找了这个列表是按照第一次搜索到最后一次搜索的顺序组织的搜索查询底层映射直到一个键被找到
2更新原始映射不同的是更新和删除只操作第一个映射
3支持所有常用字典方法
简而言之ChainMap将多个字典视为一个解锁Python超能力
Python标准库中的集合模块包含许多为性能而设计的实用的数据结构著名的包括命名元组或计数器
今天通过实例我们来看看鲜为人知的ChainMap通过浏览具体的示例我希望给你一个提示关于在更高级的Python工作中使用ChainMap将如何从中受益
"""
from collections import ChainMap
baseline = {'music': 'bach', 'art': 'rembrandt'}
adjustments = {'art': 'van gogh', 'opera': 'carmen'}
test = ChainMap(adjustments, baseline)
print(test)
test1 = list(ChainMap(adjustments, baseline))
print(test1)
# 存在重复元素时,也不会去重
dcic1 = {'label1': '11', 'label2': '22'}
dcic2 = {'label2': '22', 'label3': '33'}
dcic3 = {'label4': '44', 'label5': '55'}
last = ChainMap(dcic1, dcic2, dcic3)
print(last)
print(last['label2'])
"""
new_child()方法
用法new_child(m=None)
返回一个新的ChainMap类包含了一个新映射(map)后面跟随当前实例的全部映射map
如果m被指定它就成为不同新的实例就是在所有映射前加上 m如果没有指定就加上一个空字典
这样的话一个 d.new_child() 调用等价于ChainMap({}, *d.maps) 这个方法用于创建子上下文不改变任何父映射的值
"""
aa = last.new_child(m={'key_new': 888})
print(aa)
"""
parents属性
属性返回一个新的ChainMap包含所有的当前实例的映射除了第一个
这样可以在搜索的时候跳过第一个映射使用的场景类似在 nested scopes 嵌套作用域中使用nonlocal关键词
用例也可以类比内建函数super() 一个d.parents 的引用等价于ChainMap(*d.maps[1:])
"""
print(aa.parents)