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下载实现示例
Dec 30 Python
Python设计模式之代理模式实例
Apr 26 Python
python处理文本文件并生成指定格式的文件
Jul 31 Python
跟老齐学Python之模块的加载
Oct 24 Python
使用70行Python代码实现一个递归下降解析器的教程
Apr 17 Python
在类Unix系统上开始Python3编程入门
Aug 20 Python
python基于phantomjs实现导入图片
May 13 Python
python 环境变量和import模块导入方法(详解)
Jul 11 Python
python输出电脑上所有的串口名的方法
Jul 02 Python
python 多线程死锁问题的解决方案
Aug 25 Python
python中的对数log函数表示及用法
Dec 09 Python
python操作xlsx格式文件并读取
Jun 02 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自动更新版权信息显示的方法
2015/06/19 PHP
yii2中的rules 自定义验证规则详解
2016/04/19 PHP
PHP双向链表定义与用法示例
2018/01/31 PHP
php输出文字乱码的解决方法
2019/10/04 PHP
Dom操作之兼容技巧分享
2011/09/20 Javascript
JS添加删除一组文本框并对输入信息加以验证判断其正确性
2013/04/11 Javascript
javascript简单性能问题及学习笔记
2014/02/04 Javascript
jQuery实现渐变弹出层和弹出菜单的方法
2015/02/20 Javascript
使用node.js中的Buffer类处理二进制数据的方法
2016/11/26 Javascript
js实现简单的获取验证码按钮效果
2017/03/03 Javascript
JavaScript输出所选择起始与结束日期的方法
2017/07/12 Javascript
浅谈Angular2 模块懒加载的方法
2017/10/04 Javascript
详解项目升级到vue-cli3的正确姿势
2019/01/28 Javascript
详解Vue中使用Axios拦截器
2019/04/22 Javascript
js生成1到100的随机数最简单的实现方法
2020/02/07 Javascript
解决Vue的文本编辑器 vue-quill-editor 小图标样式排布错乱问题
2020/08/03 Javascript
Python实现的简单发送邮件脚本分享
2014/11/07 Python
python定时执行指定函数的方法
2015/05/27 Python
Django中更新多个对象数据与删除对象的方法
2015/07/17 Python
python 数据清洗之数据合并、转换、过滤、排序
2017/02/12 Python
小白如何入门Python? 制作一个网站为例
2018/03/06 Python
python实时获取外部程序输出结果的方法
2019/01/12 Python
python使用PyQt5的简单方法
2019/02/27 Python
远程部署工具Fabric详解(支持Python3)
2019/07/04 Python
Python多线程通信queue队列用法实例分析
2020/03/24 Python
python 实现两个npy档案合并
2020/07/01 Python
Python3安装模块报错Microsoft Visual C++ 14.0 is required的解决方法
2020/07/28 Python
印度尼西亚值得信赖的第一家网店:Bhinneka
2018/07/16 全球购物
G-Form护具官方网站:美国运动保护装备
2019/09/04 全球购物
什么是事务?为什么需要事务?
2012/01/09 面试题
IBatis持久层技术
2016/07/18 面试题
升职自荐信范文
2013/10/05 职场文书
个人评语大全
2014/05/04 职场文书
专家推荐信模板
2014/05/09 职场文书
就职演讲稿范文
2014/05/19 职场文书
教你利用Nginx 服务搭建子域环境提升二维地图加载性能的步骤
2021/09/25 Servers