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多线程抓取代理服务器IP地址的示例
Nov 09 Python
Python下rrdtool模块的基本使用方法
Nov 13 Python
Python for Informatics 第11章之正则表达式(四)
Apr 21 Python
python爬虫中get和post方法介绍以及cookie作用
Feb 08 Python
在python中按照特定顺序访问字典的方法详解
Dec 14 Python
python最小生成树kruskal与prim算法详解
Jan 17 Python
python实现操作文件(文件夹)
Oct 31 Python
关于Python解包知识点总结
May 05 Python
Python网络爬虫四大选择器用法原理总结
Jun 01 Python
python3中calendar返回某一时间点实例讲解
Nov 18 Python
Jupyter notebook 输出部分显示不全的解决方案
Apr 24 Python
Python深度学习之实现卷积神经网络
Jun 05 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面向对象全攻略 (十一)__toString()用法 克隆对象 __call处理调用错误
2009/09/30 PHP
php中用数组的方法设置cookies
2011/04/21 PHP
CI(CodeIgniter)框架配置
2014/06/10 PHP
javascript数组与php数组的地址传递及值传递用法实例
2015/01/22 PHP
php查询mysql大量数据造成内存不足的解决方法
2015/03/04 PHP
PHP配置把错误日志以邮件方式发送方法(Windows系统)
2015/06/23 PHP
mod_php、FastCGI、PHP-FPM等PHP运行方式对比
2015/07/02 PHP
Zend Framework教程之Zend_Db_Table_Row用法实例分析
2016/03/21 PHP
Javascript 判断 object 的特定类转载
2007/02/01 Javascript
javascript 解析后的xml对象的读取方法细解
2009/07/25 Javascript
引入JS文件IE6报语法错误或缺少对象问题的解决方法
2014/01/09 Javascript
jQuery中:hidden选择器用法实例
2014/12/30 Javascript
在JS中操作时间之getUTCMilliseconds()方法的使用
2015/06/10 Javascript
javascript实现网页端解压并查看zip文件
2015/12/15 Javascript
vue中mint-ui的使用方法
2018/04/04 Javascript
vue的常用组件操作方法应用分析
2018/04/13 Javascript
Vue源码探究之状态初始化
2018/11/14 Javascript
javascript实现京东登录显示隐藏密码
2020/08/02 Javascript
[02:15]2015国际邀请赛选手档案IG.Ferrari 430
2015/07/30 DOTA
python笔记(2)
2012/10/24 Python
Python内置的字符串处理函数详细整理(覆盖日常所用)
2014/08/19 Python
python代码 FTP备份交换机配置脚本实例解析
2019/08/01 Python
python查询MySQL将数据写入Excel
2020/10/29 Python
个人作风剖析材料
2014/02/02 职场文书
《找不到快乐的波斯猫》教学反思
2014/02/24 职场文书
物业经理自我鉴定
2014/03/03 职场文书
优秀经理获奖感言
2014/03/04 职场文书
个人安全承诺书
2014/05/22 职场文书
年检委托书
2014/08/30 职场文书
导游词范文
2015/02/13 职场文书
高中生综合素质自我评价
2015/03/06 职场文书
2015年班级工作总结范文
2015/04/03 职场文书
旷工辞退通知书
2015/04/17 职场文书
用Python编写简单的gRPC服务的详细过程
2021/07/04 Python
JavaScript实现优先级队列
2021/12/06 Javascript
js 实现Material UI点击涟漪效果示例
2022/09/23 Javascript