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中操作字符串之rstrip()方法的使用
May 19 Python
Python socket编程实例详解
May 27 Python
使用Python &amp; Flask 实现RESTful Web API的实例
Sep 19 Python
Python+OpenCV让电脑帮你玩微信跳一跳
Jan 04 Python
Anaconda下安装mysql-python的包实例
Jun 11 Python
Python实现程序判断季节的代码示例
Jan 28 Python
python仿evething的文件搜索器实例代码
May 13 Python
python3+PyQt5 实现Rich文本的行编辑方法
Jun 17 Python
利用Python实现kNN算法的代码
Aug 16 Python
python聚类算法解决方案(rest接口/mpp数据库/json数据/下载图片及数据)
Aug 28 Python
Python数据结构dict常用操作代码实例
Mar 12 Python
写一个Python脚本自动爬取Bilibili小视频
Apr 24 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
回首过去10年中最搞笑的10部动漫,哪一部让你节操尽碎?
2020/03/03 日漫
深入PHP curl参数的详解
2013/06/17 PHP
php内嵌函数用法实例
2015/03/20 PHP
dvwa+xampp搭建显示乱码的问题及解决方案
2015/08/23 PHP
javascript 常用方法总结
2009/06/03 Javascript
jquery中的过滤操作详细解析
2013/12/02 Javascript
js事件绑定快捷键以ctrl+k为例
2014/09/30 Javascript
JavaScript中实现继承的三种方式和实例
2015/01/29 Javascript
JS去除iframe滚动条的方法
2015/04/01 Javascript
Web Uploader文件上传插件使用详解
2016/05/10 Javascript
利用jQuery实现打字机字幕效果实例代码
2016/09/02 Javascript
nodejs简单实现操作arduino
2016/09/25 NodeJs
学习vue.js条件渲染
2016/12/03 Javascript
JavaScript学习总结(一) ECMAScript、BOM、DOM(核心、浏览器对象模型与文档对象模型)
2018/01/07 Javascript
web前端vue filter 过滤器
2018/01/12 Javascript
微信小程序实现滑动切换自定义页码的方法分析
2018/12/29 Javascript
layui添加动态菜单与选项卡 AJAX请求的例子
2019/09/25 Javascript
返回上一个url并刷新界面的js代码
2020/09/12 Javascript
解决ant-design-vue中menu菜单无法默认展开的问题
2020/10/31 Javascript
python3+PyQt5泛型委托详解
2018/04/24 Python
Python随机生成身份证号码及校验功能
2018/12/04 Python
Python利用PyExecJS库执行JS函数的案例分析
2019/12/18 Python
对tensorflow中的strides参数使用详解
2020/01/04 Python
Python列表list操作相关知识小结
2020/01/29 Python
从一次项目重构说起CSS3自定义变量在项目的使用方法
2021/03/01 HTML / CSS
学校采购员岗位职责
2014/01/02 职场文书
入党自我评价优缺点
2014/01/25 职场文书
捐赠仪式主持词
2014/03/19 职场文书
上海世博会志愿者口号
2014/06/17 职场文书
社区学习党的群众路线教育实践活动心得体会
2014/11/03 职场文书
2015公务员年度考核评语
2015/03/25 职场文书
情况说明书怎么写
2015/10/08 职场文书
创业分两种人:那么哪些适合创业?,哪些适合不适合创业呢?
2019/08/23 职场文书
MySQL学习总结-基础架构概述
2021/04/05 MySQL
react 项目中引入图片的几种方式
2021/06/02 Javascript
JavaScript文档对象模型DOM
2021/11/20 Javascript