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之总结参数的传递
Oct 10 Python
Python中编写ORM框架的入门指引
Apr 29 Python
利用Python为iOS10生成图标和截屏
Sep 24 Python
Python 转义字符详细介绍
Mar 21 Python
浅谈python for循环的巧妙运用(迭代、列表生成式)
Sep 26 Python
启动targetcli时遇到错误解决办法
Oct 26 Python
对numpy中的transpose和swapaxes函数详解
Aug 02 Python
Python代码太长换行的实现
Jul 05 Python
Python小整数对象池和字符串intern实例解析
Mar 21 Python
python 安装移动复制第三方库操作
Jul 13 Python
Windows环境下Python3.6.8 importError: DLLload failed:找不到指定的模块
Nov 01 Python
Golang Web 框架Iris安装部署
Aug 14 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缩放图片(根据宽高的等比例缩放)实例介绍
2013/06/09 PHP
smarty模板引擎中自定义函数的方法
2015/01/22 PHP
php计算title标题相似比的方法
2015/07/29 PHP
php批量删除超链接的实现方法
2015/10/19 PHP
php实现小程序支付完整版
2018/10/09 PHP
Nginx+php配置文件及原理解析
2020/12/09 PHP
用Javascript实现锚点(Anchor)间平滑跳转
2009/09/08 Javascript
jQuery EasyUI API 中文文档 - Tabs标签页/选项卡
2011/10/01 Javascript
jQuery选择器简明总结(含用法实例,一目了然)
2014/04/25 Javascript
js防止页面被iframe调用的方法
2014/10/30 Javascript
js脚本分页代码分享(7种样式)
2015/08/19 Javascript
jquery实现超简洁的TAB选项卡效果代码
2015/08/28 Javascript
JavaScript学习笔记之数组随机排序
2016/03/23 Javascript
使用jQuery Rotare实现微信大转盘抽奖功能
2016/06/20 Javascript
详解React-Todos入门例子
2016/11/08 Javascript
JavaScript之面向对象_动力节点Java学院整理
2017/06/29 Javascript
使用vue与jquery实时监听用户输入状态的操作代码
2017/09/19 jQuery
vue 实现cli3.0中使用proxy进行代理转发
2019/10/30 Javascript
python实现文件分组复制到不同目录的例子
2014/06/04 Python
Python极简代码实现杨辉三角示例代码
2016/11/15 Python
Python获取指定文件夹下的文件名的方法
2018/02/06 Python
python排序函数sort()与sorted()的区别
2018/09/18 Python
使用Python代码实现Linux中的ls遍历目录命令的实例代码
2019/09/07 Python
Python实现的爬取豆瓣电影信息功能案例
2019/09/15 Python
Python 获取项目根路径的代码
2019/09/27 Python
8段用于数据清洗Python代码(小结)
2019/10/31 Python
利用python中集合的唯一性实现去重
2020/02/11 Python
品德评语大全
2014/05/05 职场文书
社区志愿者活动总结
2014/06/26 职场文书
四风问题查摆材料
2014/08/25 职场文书
销售业务员岗位职责
2015/02/13 职场文书
逃课检讨书范文
2015/05/06 职场文书
售房协议书范本
2015/08/11 职场文书
2016廉政教育学习心得体会
2016/01/25 职场文书
2019终止劳动合同协议书最新范本!
2019/07/09 职场文书
在CSS中映射鼠标位置并实现通过鼠标移动控制页面元素效果(实例代码)
2021/04/22 HTML / CSS