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实现远程调用MetaSploit的方法
Aug 22 Python
python实现识别相似图片小结
Feb 22 Python
详谈套接字中SO_REUSEPORT和SO_REUSEADDR的区别
Apr 28 Python
利用pandas读取中文数据集的方法
Jul 25 Python
python2和python3在处理字符串上的区别详解
May 29 Python
python集合的创建、添加及删除操作示例
Oct 08 Python
通过实例解析Python调用json模块
Dec 11 Python
Python任务调度利器之APScheduler详解
Apr 02 Python
Python中关于logging模块的学习笔记
Jun 03 Python
什么是python的函数体
Jun 19 Python
最新pycharm安装教程
Nov 18 Python
Tensorflow与RNN、双向LSTM等的踩坑记录及解决
May 31 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 网络开发详解之远程文件包含漏洞
2010/04/25 PHP
获取URL文件名后缀
2013/10/24 PHP
PHP SPL标准库之接口(Interface)详解
2015/05/11 PHP
ThinkPHP5.1+Ajax实现的无刷新分页功能示例
2020/02/10 PHP
javascript 动态数据下的锚点错位问题解决方法
2008/12/24 Javascript
一个背景云变换js特效 鼠标移动背景云变化
2012/12/28 Javascript
jQuery 遍历- 关于closest() 的方法介绍以及与parents()的方法区别分析
2013/04/26 Javascript
JS.GetAllChild(element,deep,condition)使用介绍
2013/09/21 Javascript
javascript里绝对用的上的字符分割函数总结
2014/07/31 Javascript
jquery中change()用法实例分析
2015/02/06 Javascript
Javascript获取表单名称(name)的方法
2015/04/02 Javascript
javascript实现十秒钟后注册按钮可点击的方法
2015/05/13 Javascript
深入理解vue中的$set
2017/06/01 Javascript
在vue-cli的组件模板里使用font-awesome的两种方法
2018/09/28 Javascript
关于AngularJS中几种Providers的区别总结
2020/05/17 Javascript
使用JavaScript获取Django模板指定键值数据
2020/05/27 Javascript
[46:43]DOTA2上海特级锦标赛D组小组赛#1 EG VS COL第三局
2016/02/28 DOTA
python实现html转ubb代码(html2ubb)
2014/07/03 Python
在Django中创建第一个静态视图
2015/07/15 Python
在Python的Flask框架中构建Web表单的教程
2016/06/04 Python
Python 获得13位unix时间戳的方法
2017/10/20 Python
Python实现的随机森林算法与简单总结
2018/01/30 Python
Flask实现跨域请求的处理方法
2018/09/27 Python
Python实现连接MySql数据库及增删改查操作详解
2019/04/16 Python
python时间日期操作方法实例小结
2020/02/06 Python
使用CSS3来匹配横屏竖屏的简单方法
2015/08/04 HTML / CSS
申报职称专业技术个人的自我评价
2013/12/12 职场文书
加入学生会演讲稿
2014/04/24 职场文书
党的群众路线学习材料
2014/05/16 职场文书
建筑安全生产责任书
2014/07/22 职场文书
商务经理岗位职责
2014/08/03 职场文书
励志演讲稿800字
2014/08/21 职场文书
2014年共青团工作总结
2014/12/10 职场文书
小学校长个人总结
2015/03/03 职场文书
小学见习报告
2015/06/23 职场文书
团组织关系介绍信
2019/06/24 职场文书