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 相关文章推荐
Django中几种重定向方法
Apr 28 Python
Python 字典与字符串的互转实例
Jan 13 Python
django模型层(model)进行建表、查询与删除的基础教程
Nov 21 Python
面向初学者的Python编辑器Mu
Oct 08 Python
python基于itchat模块实现微信防撤回
Apr 29 Python
用python建立两个Y轴的XY曲线图方法
Jul 08 Python
python笔记_将循环内容在一行输出的方法
Aug 08 Python
PyTorch里面的torch.nn.Parameter()详解
Jan 03 Python
Python figure参数及subplot子图绘制代码
Apr 18 Python
python 自动化偷懒的四个实用操作
Apr 11 Python
浅谈Python项目的服务器部署
Apr 25 Python
Python机器学习应用之工业蒸汽数据分析篇详解
Jan 18 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
[原创]PHPCMS遭遇会员投稿审核无效的解决方法
2017/01/11 PHP
PHP实现使用DOM将XML数据存入数组的方法示例
2017/09/27 PHP
IE与firefox之jquery用法区别
2008/10/03 Javascript
js 通用javascript函数库整理
2011/08/14 Javascript
JavaScript Scoping and Hoisting 翻译
2012/07/03 Javascript
jquery1.83 之前所有与异步列队相关的模块详细介绍
2012/11/13 Javascript
javascript获取dom的下一个节点方法
2014/09/05 Javascript
九种原生js动画效果
2015/11/11 Javascript
弹出遮罩层后禁止滚动效果【实现代码】
2016/04/29 Javascript
JavaScript中的冒泡排序法
2016/08/03 Javascript
基于JS+Canves实现点击按钮水波纹效果
2016/09/15 Javascript
jQuery Checkbox 全选 反选的简单实例
2016/11/29 Javascript
AngularJS使用ocLazyLoad实现js延迟加载
2017/07/05 Javascript
iframe高度自适应及隐藏滚动条的实例详解
2017/09/29 Javascript
JS+WCF实现进度条实时监测数据加载量的方法详解
2017/12/19 Javascript
Vue.js点击切换按钮改变内容的实例讲解
2018/08/22 Javascript
详解JavaScript对数组操作(添加/删除/截取/排序/倒序)
2019/04/28 Javascript
浅谈vue-router路由切换 组件重用挖下的坑
2019/11/01 Javascript
Python利用正则表达式匹配并截取指定子串及去重的方法
2015/07/30 Python
火车票抢票python代码公开揭秘!
2018/03/08 Python
python 去除二维数组/二维列表中的重复行方法
2019/01/23 Python
快速排序的四种python实现(推荐)
2019/04/03 Python
python列表返回重复数据的下标
2020/02/10 Python
python实现处理mysql结果输出方式
2020/04/09 Python
python字典按照value排序方法
2020/12/28 Python
python 自动识别并连接串口的实现
2021/01/19 Python
Willer台湾:日本高速巴士/夜行巴士预约
2017/07/09 全球购物
泰国王权免税店官方网站:KingPower
2019/03/11 全球购物
美国第二大连锁药店:Rite Aid
2019/04/03 全球购物
高中自我评价范文
2014/01/27 职场文书
总经理的岗位职责
2014/02/23 职场文书
税务干部群众路线教育实践活动自我剖析材料
2014/09/21 职场文书
成都人事代理协议书
2014/10/25 职场文书
2015年前台文员工作总结
2015/05/18 职场文书
2016新年感言
2015/08/03 职场文书
反腐倡廉学习心得体会范文
2015/08/15 职场文书