一个 ChainMap 类是为了将多个映射快速的链接到一起,这样它们就可以作为一个单元处理。它通常比创建一个新字典和多次调用 update() 要快很多。

class collections.ChainMap(*maps)

支持所有常用字典方法。另外还有一个 maps 属性(attribute),一个创建子上下文的方法(method), 一个存取它们首个映射的属性(property):

maps

  一个可以更新的映射列表。这个列表是按照第一次搜索到最后一次搜索的顺序组织的。它是仅有的存储状态,可以被修改。列表最少包含一个映射。

new_child(m=None)

  返回一个新的 ChainMap 类,包含了一个新映射(map),后面跟随当前实例的全部映射(map)。如果 m 被指定,它就成为不同新的实例,就是在所有映射前加上 m,如果没有指定,就加上一个空字典,这样的话一个 d.new_child() 调用等价于 ChainMap({}, *d.maps) 。这个方法用于创建子上下文,不改变任何父映射的值。

在 3.4 版更改: 添加了 m 可选参数。

parents

属性返回一个新的 ChainMap 包含所有的当前实例的映射,除了第一个。这样可以在搜索的时候跳过第一个映射。

现在假设你必须在两个字典中执行查找操作 (比如先从 a 中找,如果找不到再在 b中找)。一个非常简单扼解决方案就是使用 collections 模块中的 ChainMap 类。比如:
In [46]: a = {'x': 1, 'z': 3 }                                                                                                       

In [47]: b = {'y': 2, 'z': 4 }                                                                                                       

In [48]: from collections import ChainMap                                                                                            

In [49]: c=ChainMap(a,b)                                                                                                             

In [50]: c.get('x')
Out[50]: 1 In [51]: c.get('z')
Out[51]: 3 In [52]: c.get('y')
Out[52]: 2

如果出现重复键,那么第一次出现的映射值会被返回。因此,例子程序中的c['z']总是会返回字典a中对应的值,而不是b中对应的值。

对于字典的更新或删除操作总是影响的是列表中第一个字典。比如:
In [65]: c
Out[65]: ChainMap({'x': 1, 'z': 10}, {'y': 2, 'z': 4}) In [66]: c['x']=10 In [67]: c['z']=10 In [68]: c
Out[68]: ChainMap({'x': 10, 'z': 10}, {'y': 2, 'z': 4}) del c['y'] KeyError: "Key not found in the first mapping: 'y'"

  

一个 ChainMap 通过引用合并底层映射。 所以,如果一个底层映射更新了,这些更改会反映到 ChainMap 。

In [71]: a['x']=100                                                                                                                  

In [72]: c
Out[72]: ChainMap({'x': 100, 'z': 10}, {'y': 2, 'z': 4})

  

new_child()方法和parents属性

d=c.new_child()                                                                                                             

In [81]: d
Out[81]: ChainMap({}, {'x': 100, 'z': 10}, {'y': 2, 'z': 4}) In [82]: d['x']=1 In [83]: d
Out[83]: ChainMap({'x': 1}, {'x': 100, 'z': 10}, {'y': 2, 'z': 4}) In [84]: d=d.new_child() In [85]: d['x']=2 In [86]: d
Out[86]: ChainMap({'x': 2}, {'x': 1}, {'x': 100, 'z': 10}, {'y': 2, 'z': 4}) In [89]: d=d.parents In [90]: d['x']
Out[90]: 1 In [91]: d
Out[91]: ChainMap({'x': 1}, {'x': 100, 'z': 10}, {'y': 2, 'z': 4}) In [92]: d=d.parents In [93]: d['x']
Out[93]: 100

  

典型用例

让用户指定的命令行参数优先于环境变量,优先于默认值的例子

import os, argparse

defaults = {'color': 'red', 'user': 'guest'}

parser = argparse.ArgumentParser()
parser.add_argument('-u', '--user')
parser.add_argument('-c', '--color')
namespace = parser.parse_args()
command_line_args = {k:v for k, v in vars(namespace).items() if v} combined = ChainMap(command_line_args, os.environ, defaults)
print(combined['color'])
print(combined['user'])

  

Collections--ChainMap的更多相关文章

  1. deque/defaultdict/orderedict/collections.namedtuple()/collections.ChainMap() 笔记

    关于deque的使用 collections.deque([list[, max_length]]) # 不限定长度,可随意添加没有上限 >>> from collections i ...

  2. collections.ChainMap类合并字典或映射

    ## 使用update()方法或者ChainMap类合并字典或映射 # 使用update()方法合并 a = {'x': 1, 'z': 3} b = {'y': 2, 'z': 4} merged ...

  3. python中的collections

    python中有大量的内置模块,很多是属于特定开发的功能性模块,但collections是属于对基础数据的类型的补充模块,因此,在日常代码中使用频率更高一些,值得做个笔记,本文只做主要关键字介绍,详细 ...

  4. Python collections模块总结

    Python collections模块总结 除了我们使用的那些基础的数据结构,还有包括其它的一些模块提供的数据结构,有时甚至比基础的数据结构还要好用. collections ChainMap 这是 ...

  5. 【转】python模块分析之collections(六)

    [转]python模块分析之collections(六) collections是Python内建的一个集合模块,提供了许多有用的集合类. 系列文章 python模块分析之random(一) pyth ...

  6. python内置模块之collections(六)

    前言 collections是Python内建的一个集合模块,提供了许多有用的集合类. 系列文章 python模块分析之random(一) python模块分析之hashlib加密(二) python ...

  7. Python3 collections模块的使用

    collections 介绍 collections是Python内建的一个集合模块,提供了许多有用的集合类和方法. 可以把它理解为一个容器,里面提供Python标准内建容器 dict , list  ...

  8. Python3标准库:collections容器数据类型

    1. collections容器数据类型 collections模块包含除内置类型list.dict和tuple以外的其他容器数据类型. 1.1 ChainMap搜索多个字典 ChainMap类管理一 ...

  9. 笔记-python-standard library-8.3.collections

    笔记-python-standard library-8.3.collections 1.      collections简介 Source code: Lib/collections/__init ...

  10. dict、defaultdict 和 OrderedDict 比较

    一.dict.defaultdict 和 OrderedDict 常见的方法比较 dict.defaultdict 和 OrderedDict 常见的方法比较   dict defaultdict O ...

随机推荐

  1. Unity 渲染教程(三):使用多张纹理贴图

    对多个纹理进行采样 应用一张细节贴图 在线性空间中处理颜色 使用一张splat纹理 这是关于渲染的教程系列的第三部分. 前面的部分介绍了着色器和纹理. 我们已经看到如何使用单个纹理来使平坦表面看起来更 ...

  2. C语言入门hello world

    1.安装软件 c语言开发工具众多,初学者推荐使用Dev-Cpp 5.6.3 TDM-GCC x64 4.8.1 Setup.exe:安装过程全部默认安装即可. 2.使用Dev-Cpp编写第一个入门实例 ...

  3. python小案例-计算输入两个数的最大公约数与最小公倍数

    # 计算最大公约数 def gcd(x,y): """ 计算最大公约数 :param x:一个正整数 :param y:一个正整数 :return:x,y的最大公约数 & ...

  4. Gym-101242B:Branch Assignment(最短路,四边形不等式优化DP)

    题意:要完成一个由s个子项目组成的项目,给b(b>=s)个部门分配,从而把b个部门分成s个组.分组完成后,每一组的任 意两个点之间都要传递信息.假设在(i,j)两个点间传送信息,要先把信息加密, ...

  5. SpringBoot——探究HelloWorld【三】

    前言 前面我们写了helloworld的一个,这里我们对他进行分析 探究 那么下面就开始我们的探究之旅吧,首先从POM文件来,在POM文件中我们导入了项目所需要的依赖 POM文件 父项目 <pa ...

  6. 高性能MySQL(一)——索引

    一.mysql索引分类 单值索引:一个索引只包含单个列,一个表可以有多个单列索引 唯一索引:索引列的值必须唯一,但允许有空值 复合索引:一个索引包含多个列 基本语法: 创建:1.CREATE [UNI ...

  7. Ofbiz项目学习——阶段性小结——查询

    一.组装参数的学习 首先是查询条件,对于查询条件,需要判断是否从前端传递空值?——怎么处理查询空值? 当然可以一个一个进行判断,但是这样代码会导致很多,可以统一处理,形成一个公共方法. 1. 单个处理 ...

  8. python - django 将图片路径地址转换成 InMemoryUploadedFile 并存储数据库

    # 问题场景:对接第三方时遇到一个图片存储问题,对方给的是他们服务器的图片路径地址,但是 我这里存储图片用的是 ImageField  字段属性,也设置了存储路径,现在一旦将图片显示到前端就会将设置的 ...

  9. SpringBoot整合ActiveMQ发送邮件

    虽然ActiveMQ以被其他MQ所替代,但仍有学习的意义,本文采用邮件发送的例子展示ActiveMQ 1. 生产者1.1 引入maven依赖1.2 application.yml配置1.3 创建配置类 ...

  10. 再说js隐式转换

    再说js隐式转换 自己整理的一个整体规则如下: Date 默认 走 toString, 如果 toString 返回的是对象, 那么查看 valueOf 其他对象的转换, 默认走 valueOf, 但 ...