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的循环体中使用else语句的方法
Mar 30 Python
python查询sqlite数据表的方法
May 08 Python
浅谈python字典多键值及重复键值的使用
Nov 04 Python
Python操作json的方法实例分析
Dec 06 Python
python实现网页自动签到功能
Jan 21 Python
python 读取dicom文件,生成info.txt和raw文件的方法
Jan 24 Python
python查看文件大小和文件夹内容的方法
Jul 08 Python
wxPython+Matplotlib绘制折线图表
Nov 19 Python
python scatter函数用法实例详解
Feb 11 Python
Python3.x+pyqtgraph实现数据可视化教程
Mar 14 Python
Python如何将装饰器定义为类
Jul 30 Python
Python制作春联的示例代码
Jan 22 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的无限分类实现想法~
2007/01/02 PHP
php imagecreatetruecolor 创建高清和透明图片代码小结
2010/05/15 PHP
web站点获取用户IP的安全方法 HTTP_X_FORWARDED_FOR检验
2013/06/01 PHP
php获得用户ip地址的比较不错的方法
2014/02/08 PHP
php实现图片转换成ASCII码的方法
2015/04/03 PHP
PHP中子类重载父类的方法【parent::方法名】
2016/05/06 PHP
学习YUI.Ext 第六天--关于树TreePanel(Part 1)
2007/03/10 Javascript
关于js中window.location.href,location.href,parent.location.href,top.location.href的用法与区别
2010/10/18 Javascript
jQuery中delegate与on的用法与区别示例介绍
2013/12/20 Javascript
jQuery aminate方法定位到页面具体位置
2013/12/26 Javascript
jquery实现的导航固定效果
2014/04/28 Javascript
web前端设计师们常用的jQuery特效插件汇总
2014/12/07 Javascript
node.js中的fs.readFileSync方法使用说明
2014/12/15 Javascript
jquery+ajax实现直接提交表单实例分析
2016/06/17 Javascript
ES6中字符串string常用的新增方法小结
2017/11/07 Javascript
angular写一个列表的选择全选交互组件的示例
2018/01/22 Javascript
详解vue 数据传递的方法
2018/04/19 Javascript
Vue + better-scroll 实现移动端字母索引导航功能
2018/05/07 Javascript
详解Vue的watch中的immediate与watch是什么意思
2019/12/30 Javascript
vuex中store存储store.commit和store.dispatch的用法
2020/07/24 Javascript
python中urllib模块用法实例详解
2014/11/19 Python
对Python3使运行暂停的方法详解
2019/02/18 Python
使用OpenCV获取图像某点的颜色值,并设置某点的颜色
2020/06/02 Python
html5定位获取当前位置并在百度地图上显示
2014/08/22 HTML / CSS
澳大利亚在线购买儿童玩具:Toy Universe
2017/12/28 全球购物
屈臣氏乌克兰:Watsons UA
2019/10/29 全球购物
求职自荐信
2013/12/14 职场文书
军校大学生个人的自我评价
2014/02/17 职场文书
幼儿园儿童节活动主持词+串词大全
2014/03/21 职场文书
协议书样本
2014/04/23 职场文书
沙滩主题婚礼活动策划方案
2014/09/15 职场文书
2014学习十八届四中全会精神思想汇报范文
2014/10/23 职场文书
小学班主任工作总结2015
2015/04/07 职场文书
庆祝教师节主题班会
2015/08/17 职场文书
Java实现多文件上传功能
2021/06/30 Java/Android
Windows Server 2019 配置远程控制以及管理方法
2022/04/28 Servers