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自动重试HTTP连接装饰器
Apr 28 Python
Python实现简易端口扫描器代码实例
Mar 15 Python
python itchat实现微信好友头像拼接图的示例代码
Aug 14 Python
python实现批量解析邮件并下载附件
Jun 19 Python
Python绘制的二项分布概率图示例
Aug 22 Python
python得到单词模式的示例
Oct 15 Python
对Python通过pypyodbc访问Access数据库的方法详解
Oct 27 Python
Pytorch DataLoader 变长数据处理方式
Jan 08 Python
Python3 实现爬取网站下所有URL方式
Jan 16 Python
python读写文件write和flush的实现方式
Feb 21 Python
用Python开发app后端有优势吗
Jun 29 Python
python语言实现贪吃蛇游戏
Nov 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
怎样在UNIX系统下安装MySQL
2006/10/09 PHP
菜鸟学PHP之Smarty入门
2007/01/04 PHP
PHP insert语法详解
2008/06/07 PHP
PHP获取网页所有连接的方法(附demo源码下载)
2016/03/30 PHP
js常见表单应用技巧
2008/01/09 Javascript
php gethostbyname获取域名ip地址函数详解
2010/01/24 Javascript
JS自动缩小超出大小的图片
2012/10/12 Javascript
jQuery实现表头固定效果的实例代码
2013/05/24 Javascript
javascript获取下拉列表框当中的文本值示例代码
2013/07/31 Javascript
jquery实现倒计时功能
2015/12/28 Javascript
jQuery Mobile 触摸事件实例
2016/06/04 Javascript
js实现目录链接,内容跟着目录滚动显示的简单实例
2016/10/15 Javascript
bootstrap输入框组使用方法
2017/02/07 Javascript
vue实现添加与删除图书功能
2018/10/07 Javascript
node全局变量__dirname与__filename的区别
2019/01/14 Javascript
微信小程序MUI导航栏透明渐变功能示例(通过改变opacity实现)
2019/01/24 Javascript
详解javascript函数写法大全
2019/03/25 Javascript
vue数据响应式原理知识点总结
2020/02/16 Javascript
python实现清屏的方法
2015/04/30 Python
python动态加载包的方法小结
2016/04/18 Python
使用实现XlsxWriter创建Excel文件并编辑
2018/05/04 Python
python实现对指定字符串补足固定长度倍数截断输出的方法
2018/11/15 Python
深入浅析Python2.x和3.x版本的主要区别
2018/11/30 Python
使用pycharm在本地开发并实时同步到服务器
2019/08/02 Python
python 通过邮件控制实现远程控制电脑操作
2020/03/16 Python
python数据库开发之MongoDB安装及Python3操作MongoDB数据库详细方法与实例
2020/03/18 Python
Python3与fastdfs分布式文件系统如何实现交互
2020/06/23 Python
html5实现图片转圈的动画效果——让页面动起来
2017/10/16 HTML / CSS
用canvas做一个DVD待机动画的实现代码
2019/04/12 HTML / CSS
全球速卖通西班牙站:AliExpress西班牙
2017/10/30 全球购物
Perfume’s Club英国官网:购买香水和护肤品
2019/11/02 全球购物
中学学校门卫岗位职责
2014/08/15 职场文书
庆六一活动总结
2014/08/29 职场文书
学校法制宣传日活动总结
2014/11/01 职场文书
java基础——多线程
2021/07/03 Java/Android
nginx配置虚拟主机的详细步骤
2021/07/21 Servers