python ChainMap的使用和说明详解


Posted in Python onJune 11, 2019

ChainMap是Python collections模块中的一个成员,它用来将多个map组合到一起。Chain是链条的意思,字面意思就是把map串联到一起。

问题的背景是我们有多个字典或者映射,想把它们合并成为一个单独的映射,有人说可以用update进行合并,这样做的问题就是新建了一个数据结构以致于当我们对原来的字典进行更改的时候不会同步。如果想建立一个同步的查询方法,可以使用ChainMap

先看一下初步使用

from collections import ChainMap
a = {"x":1, "z":3}
b = {"y":2, "z":4}
c = ChainMap(a,b)
print(c)
print("x: {}, y: {}, z: {}".format(c["x"], c["y"], c["z"]))

输出:

ChainMap({'x': 1, 'z': 3}, {'y': 2, 'z': 4})
x: 1, y: 2, z: 3
[Finished in 0.1s]

这是ChainMap最基本的使用,可以用来合并两个或者更多个字典,当查询的时候,从前往后依次查询。

有一个注意点就是当对ChainMap进行修改的时候总是只会对第一个字典进行修改

In [6]: a = {"x":1, "z":3}

In [7]: b = {"y":2, "z":4}

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

In [9]: c
Out[9]: ChainMap({'z': 3, 'x': 1}, {'z': 4, 'y': 2})

In [10]: c["z"]
Out[10]: 3

In [11]: c["z"] = 4

In [12]: c
Out[12]: ChainMap({'z': 4, 'x': 1}, {'z': 4, 'y': 2})

In [13]: c.pop('z')
Out[13]: 4

In [14]: c
Out[14]: ChainMap({'x': 1}, {'z': 4, 'y': 2})

In [15]: del c["y"]
---------------------------------------------------------------------------
KeyError                 Traceback (most recent call last)
。。。。。。
KeyError: "Key not found in the first mapping: 'y'"

ChainMap和带有作用域的值,诸如全局变量,局部变量之间工作的时候特别有效,

In [4]: a = ChainMap()

In [5]: a["x"]=1

In [6]: a
Out[6]: ChainMap({'x': 1})

In [7]: b = a.new_child()

In [8]: b
Out[8]: ChainMap({}, {'x': 1})

In [9]: b["x"] = 2

In [10]: b
Out[10]: ChainMap({'x': 2}, {'x': 1})

In [11]: b["y"] = 3

In [12]: b
Out[12]: ChainMap({'x': 2, 'y': 3}, {'x': 1})

In [13]: a
Out[13]: ChainMap({'x': 1})

In [14]: c = a.new_child()

In [15]: c
Out[15]: ChainMap({}, {'x': 1})

In [16]: c["x"]
Out[16]: 1

In [17]: c["y"] = 1

In [18]: c
Out[18]: ChainMap({'y': 1}, {'x': 1})

In [19]: d = c.parents()
---------------------------------------------------------------------------
TypeError                 Traceback (most recent call last)
<ipython-input-19-dc4debb7ca3b> in <module>()
----> 1 d = c.parents()

TypeError: 'ChainMap' object is not callable

In [20]: d = c.parents

In [21]: d
Out[21]: ChainMap({'x': 1})

In [22]: d is a
Out[22]: False

In [23]: d == a
Out[23]: True

从原理上面讲,ChainMap实际上是把放入的字典存储在一个队列中,当进行字典的增加删除等操作只会在第一个字典上进行,当进行查找的时候会依次查找,new_child()方法实质上是在列表的第一个元素前放入一个字典,默认是{},而parents是去掉了列表开头的元素

In [24]: a = {"x":1, "z":3}

In [25]: b = {"y":2, "z":4}

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

In [27]: c
Out[27]: ChainMap({'x': 1, 'z': 3}, {'y': 2, 'z': 4})

In [28]: c.maps
Out[28]: [{'x': 1, 'z': 3}, {'y': 2, 'z': 4}]

In [29]: c.parents
Out[29]: ChainMap({'y': 2, 'z': 4})

In [30]: c.parents.maps
Out[30]: [{'y': 2, 'z': 4}]

In [31]: c.parents.parents
Out[31]: ChainMap({})

In [32]: c.parents.parents.parents
Out[32]: ChainMap({})

也正是因为底层是列表实现的,所以实际上ChainMap查询的字典实际上还是原来的字典的引用

ChainMap文档和示例:https://docs.python.org/3/library/collections.html#collections.ChainMap

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
实例讲解Python中的私有属性
Aug 21 Python
python使用正则表达式提取网页URL的方法
May 26 Python
剖析Django中模版标签的解析与参数传递
Jul 21 Python
Python随机数用法实例详解【基于random模块】
Apr 18 Python
Python中shape计算矩阵的方法示例
Apr 21 Python
Python虚拟环境virtualenv的安装与使用详解
May 28 Python
Python如何快速上手? 快速掌握一门新语言的方法
Nov 14 Python
Python读写zip压缩文件的方法
Aug 29 Python
Python3 使用map()批量的转换数据类型,如str转float的实现
Nov 29 Python
python使用正则表达式(Regular Expression)方法超详细
Dec 30 Python
python yield和Generator函数用法详解
Feb 10 Python
python DES加密与解密及hex输出和bs64格式输出的实现代码
Apr 13 Python
python 计算一个字符串中所有数字的和实例
Jun 11 #Python
python 实现返回一个列表中出现次数最多的元素方法
Jun 11 #Python
python ChainMap 合并字典的实现步骤
Jun 11 #Python
itchat-python搭建微信机器人(附示例)
Jun 11 #Python
python itchat实现调用微信接口的第三方模块方法
Jun 11 #Python
python 将字符串完成特定的向右移动方法
Jun 11 #Python
python itchat给指定联系人发消息的方法
Jun 11 #Python
You might like
php文章内容分页并生成相应的htm静态页面代码
2010/06/07 PHP
Laravel中使用自己编写类库的3种方法
2015/02/10 PHP
简介PHP的Yii框架中缓存的一些高级用法
2016/03/29 PHP
服务器安全设置的几个注册表设置
2007/07/28 Javascript
JQUERY复选框CHECKBOX全选,取消全选
2008/08/30 Javascript
js 单引号 传递方法
2009/06/22 Javascript
网站导致浏览器崩溃的原因总结(多款浏览器) 推荐
2010/04/15 Javascript
Javascript异步表单提交,图片上传,兼容异步模拟ajax技术
2010/05/10 Javascript
使用JavaScript构建JSON格式字符串实现步骤
2013/03/22 Javascript
jquery弹出层类代码分享
2013/12/27 Javascript
jquery datepicker参数介绍和示例
2014/04/15 Javascript
js删除局部变量的实现方法
2016/06/25 Javascript
jQuery中JSONP的两种实现方式详解
2016/09/26 Javascript
浅谈js控制li标签排序问题 js调用php函数的方法
2016/10/16 Javascript
详解Node.js中exports和module.exports的区别
2017/04/19 Javascript
详解angularjs中的隔离作用域理解以及绑定策略
2017/05/31 Javascript
关于使用js算总价的问题
2017/06/23 Javascript
详谈javascript精度问题与调整
2017/07/08 Javascript
layui select动态添加option的实例
2018/03/07 Javascript
Nuxt.js实现一个SSR的前端博客的示例代码
2019/09/06 Javascript
javascript刷新父页面方法汇总详解
2019/10/10 Javascript
vue相关配置文件详解及多环境配置详细步骤
2020/05/19 Javascript
pymssql ntext字段调用问题解决方法
2008/12/17 Python
Python 命令行非阻塞输入的小例子
2013/09/27 Python
使用Python编写简单网络爬虫抓取视频下载资源
2014/11/04 Python
在Python中使用matplotlib模块绘制数据图的示例
2015/05/04 Python
利用pyinstaller或virtualenv将python程序打包详解
2017/03/22 Python
python 爬虫 实现增量去重和定时爬取实例
2020/02/28 Python
Python+Appium实现自动化测试的使用步骤
2020/03/24 Python
施华洛世奇日本官网:SWAROVSKI日本
2018/05/04 全球购物
N.Peal官网:来自伦敦的高档羊绒品牌
2018/10/29 全球购物
吉力贝官方网站:Jelly Belly
2019/03/11 全球购物
荷兰天然和有机产品网上商城:BigGreenSmile.nl
2020/07/26 全球购物
初中开学典礼新闻稿
2015/07/17 职场文书
2016大学迎新欢迎词
2015/09/29 职场文书
SQL实现LeetCode(177.第N高薪水)
2021/08/04 MySQL