python高级容器collections -- ChainMap

collections模块实现了特定目标的容器,以提供Python标准内建容器 dict , list , set , 和 tuple 的替代选择。

包含namedtupledequeChainMapCounterOrderedDictdefaultdict等。

本章讲解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通过引用存储底层字典。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ethan-running

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值