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开发vim插件及心得分享
Nov 04 Python
python实现通过pil模块对图片格式进行转换的方法
Mar 24 Python
在Python web中实现验证码图片代码分享
Nov 09 Python
详解Python with/as使用说明
Dec 13 Python
解决pytorch GPU 计算过程中出现内存耗尽的问题
Aug 19 Python
Python 共享变量加锁、释放详解
Aug 28 Python
Python对wav文件的重采样实例
Feb 25 Python
python matplotlib包图像配色方案分享
Mar 14 Python
Django实现从数据库中获取到的数据转换为dict
Mar 27 Python
聊聊python中的循环遍历
Sep 07 Python
Python爬虫实现selenium处理iframe作用域问题
Jan 27 Python
Django migrate报错的解决方案
May 20 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的curl实现get和post的代码
2008/08/23 PHP
PHP simple_html_dom.php+正则 采集文章代码
2009/12/24 PHP
详解PHP神奇又有用的Trait
2019/03/25 PHP
javascript实现动态增加删除表格行(兼容IE/FF)
2007/04/02 Javascript
javascript之ESC(第二类混淆)
2007/05/06 Javascript
boxy基于jquery的弹出层对话框插件扩展应用 弹出层选择器
2010/11/21 Javascript
基于bootstrap风格的弹框插件
2016/12/28 Javascript
EasyUI在Panel上动态添加LinkButton按钮
2017/08/11 Javascript
详解如何实现一个简单的Node.js脚手架
2017/12/04 Javascript
微信小程序实现红包雨功能
2018/07/11 Javascript
Vue中的$set的使用实例代码
2018/10/08 Javascript
微信小程序实现订单倒计时
2020/11/01 Javascript
layui 点击重置按钮, select 并没有被重置的解决方法
2019/09/03 Javascript
在项目vue中使用echarts的操作步骤
2020/09/07 Javascript
Python复数属性和方法运算操作示例
2017/07/21 Python
Python实现读写INI配置文件的方法示例
2018/06/09 Python
Python 加密与解密小结
2018/12/06 Python
python3 小数位的四舍五入(用两种方法解决round 遇5不进)
2019/04/11 Python
Falsk 与 Django 过滤器的使用与区别详解
2019/06/04 Python
详解Python Matplotlib解决绘图X轴值不按数组排序问题
2019/08/05 Python
把vgg-face.mat权重迁移到pytorch模型示例
2019/12/27 Python
Python Selenium XPath根据文本内容查找元素的方法
2020/12/07 Python
anaconda安装pytorch1.7.1和torchvision0.8.2的方法(亲测可用)
2021/02/01 Python
Django与AJAX实现网页动态数据显示的示例代码
2021/02/24 Python
skyn ICELAND官网:冰岛成分天然护肤品
2020/08/24 全球购物
vue实现倒计时功能
2021/03/24 Vue.js
大学生的自我鉴定范文
2014/01/21 职场文书
餐饮部总监岗位职责范文
2014/02/13 职场文书
建筑结构施工求职信
2014/07/11 职场文书
内科护士节演讲稿
2014/09/11 职场文书
对外汉语教师推荐信
2015/03/27 职场文书
用人单位聘用意向书
2015/05/11 职场文书
电力工程合作意向书
2015/05/11 职场文书
MySQL数字类型自增的坑
2021/05/07 MySQL
python 实现两个变量值进行交换的n种操作
2021/06/02 Python
Java Spring Boot请求方式与请求映射过程分析
2022/06/25 Java/Android