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中处理unchecked未捕获异常实例
Jan 17 Python
python文件写入实例分析
Apr 08 Python
深入理解Django的自定义过滤器
Oct 17 Python
Pandas之drop_duplicates:去除重复项方法
Apr 18 Python
Python基于property实现类的特性操作示例
Jun 15 Python
Python3.7中安装openCV库的方法
Jul 11 Python
解决Python内层for循环如何break出外层的循环的问题
Jun 24 Python
python命令行参数用法实例分析
Jun 25 Python
python入门之井字棋小游戏
Mar 05 Python
python实现扫雷小游戏
Apr 24 Python
Python CategoricalDtype自定义排序实现原理解析
Sep 11 Python
python中对列表的删除和添加方法详解
Feb 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
全国FM电台频率大全 - 9 上海市
2020/03/11 无线电
PHP获取服务器端信息的方法
2014/11/28 PHP
php根据日期或时间戳获取星座信息和生肖等信息
2015/10/20 PHP
实现WordPress主题侧边栏切换功能的PHP脚本详解
2015/12/14 PHP
CentOS7.0下安装PHP5.6.30服务的教程详解
2018/09/29 PHP
Javascript 同时提交多个Web表单的方法
2009/02/19 Javascript
jqplot通过ajax动态画折线图的方法及思路
2013/12/08 Javascript
jquery实现textarea输入框限制字数的方法
2015/01/15 Javascript
jquery实现炫酷的叠加层自动切换特效
2015/02/01 Javascript
js中的内部属性与delete操作符介绍
2015/08/10 Javascript
Jquery Easyui验证组件ValidateBox使用详解(20)
2016/12/18 Javascript
jQuery多选框选择数量限制方法
2017/02/08 Javascript
nodejs和C语言插入mysql数据库乱码问题的解决方法
2017/04/14 NodeJs
layui问题之模拟select点击事件的实例讲解
2018/08/15 Javascript
JS拖拽排序插件Sortable.js用法实例分析
2019/02/20 Javascript
vue项目,代码提交至码云,iconfont的用法说明
2020/07/30 Javascript
理解Python中的With语句
2016/03/18 Python
python 实时遍历日志文件
2016/04/12 Python
一键搞定python连接mysql驱动有关问题(windows版本)
2016/04/23 Python
python提取图像的名字*.jpg到txt文本的方法
2018/05/10 Python
python实现图片转字符小工具
2019/04/30 Python
python之mock模块基本使用方法详解
2019/06/27 Python
英国护发和美妆在线商店:Klip Shop
2019/03/24 全球购物
英超联赛的首选足球:Mitre足球
2019/05/06 全球购物
万豪国际住宅与别墅集团:Homes & Villas by Marriott International
2020/10/08 全球购物
追悼会子女答谢词
2014/01/28 职场文书
规范化管理年活动总结
2014/08/29 职场文书
环境工程专业毕业生求职信
2014/09/30 职场文书
公司租房协议书
2014/10/14 职场文书
幼儿园大班教师个人总结
2015/02/05 职场文书
八月迷情观后感
2015/06/11 职场文书
导游词之吉林花园山
2019/10/17 职场文书
详解MySQL数据库千万级数据查询和存储
2021/05/18 MySQL
Python制作春联的示例代码
2022/01/22 Python
分享CSS盒子模型隐藏的几种方式
2022/02/28 HTML / CSS
使用Apache Camel表达REST服务的方法
2022/06/10 Servers