collections模块实现了特定目标的容器,以提供Python标准内建容器 dict , list , set , 和 tuple 的替代选择。
包含namedtuple
、deque
、ChainMap
、Counter
、OrderedDict
、defaultdict
等。
本章讲解ChainMap
,基于python3.10。
简介
collections.ChainMap(*maps)
一个 ChainMap 将多个字典或者其他映射组合在一起,创建一个单独的可更新的视图。 如果没有 maps 被指定,就提供一个默认的空字典,这样一个新链至少有一个映射。
ChainMap最基本的使用,可以用来合并两个或者更多个字典,当查询的时候,从前往后依次查询。
ChainMap类用于快速链接多个映射,以便将它们视为一个单元。它通常比创建新字典和多次调用update()快得多。
特性
ChainMap除支持所有常用字典方法。
另外还有:一个 maps 属性(attribute),一个创建子上下文的方法(new_child), 一个存取它们首个映射的属性(property)。
有如下ChainMap对象:
from collections import ChainMap
baseline = {'music': 'bach', 'art': 'rembrandt'}
adjustments = {'art': 'van gogh', 'opera': 'carmen'}
cm = ChainMap(adjustments, baseline)
print(cm)
# ChainMap({'art': 'van gogh', 'opera': 'carmen'}, {'music': 'bach', 'art': 'rembrandt'})
print(list(cm)) #['music', 'art', 'opera']
maps
按照顺序返回链中每个字典的对象列表:
print(cm.maps)
# [{'art': 'van gogh', 'opera': 'carmen'}, {'music': 'bach', 'art': 'rembrandt'}]
new_child
new_child(m=None, **kwargs)
返回一个新的 ChainMap,其中包含一个新的映射,后面跟随当前实例中的所有映射。
如果指定了 m,它会成为新的映射加在映射列表的前面;如果未指定,则会使用一个空字典,因此调用 d.new_child()
就等价于 ChainMap({}, *d.maps)
。
如果指定了任何关键字参数,它们会更新所传入的映射或新的空字典。
此方法被用于创建子上下文,它可在不改变任何上级映射的情况下被更新。
print(cm.new_child({"new_key": 666}))
# ChainMap({'new_key': 666}, {'art': 'van gogh', 'opera': 'carmen'}, {'music': 'bach', 'art': 'rembrandt'})
parent
返回一个新的 ChainMap 包含所有的当前实例的映射,除了第一个。这样可以在搜索的时候跳过第一个映射。
一个 d.parents
的引用等价于 ChainMap(*d.maps[1:])
。
print(cm.parents)
# ChainMap({'music': 'bach', 'art': 'rembrandt'})
示例
from collections import ChainMap
toys = {'Blocks': 30, 'Monopoly': 20}
computers = {'iMac': 1000, 'Chromebook': 1000, 'PC': 400}
clothing = {'Jeans': 40, 'T-shirt': 10}
inventory = ChainMap(toys, computers, clothing)
print(inventory['Monopoly']) # 20
print(inventory.get('Blocks-1')) # None
print(inventory.get('Chromebook')) # 1000
print(inventory.pop('Blocks')) # 30
print(inventory) # ChainMap({'Monopoly': 20}, {'iMac': 1000, 'Chromebook': 1000, 'PC': 400}, {'Jeans': 40, 'T-shirt': 10})
toys['Nintendo'] = 20
print(inventory) # ChainMap({'Monopoly': 20, 'Nintendo': 20}, {'iMac': 1000, 'Chromebook': 1000, 'PC': 400}, {'Jeans': 40, 'T-shirt': 10})
一个很好的特点是,在我们的例子中,toys, computers和clothing都是在相同的上下文中(解释器),它们可以来自完全不同的模块或包。这是因为ChainMap通过引用存储底层字典。