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入门_浅谈逻辑判断与运算符
May 16 Python
Python编程把二叉树打印成多行代码
Jan 04 Python
python调用百度语音识别实现大音频文件语音识别功能
Aug 30 Python
python 生成图形验证码的方法示例
Nov 11 Python
Python魔法方法功能与用法简介
Apr 04 Python
django foreignkey外键使用的例子 相当于left join
Aug 06 Python
Django项目后台不挂断运行的方法
Aug 31 Python
python GUI库图形界面开发之PyQt5浏览器控件QWebEngineView详细使用方法
Feb 26 Python
Python tkinter实现简单加法计算器代码实例
May 13 Python
用python计算文件的MD5值
Dec 23 Python
python 使用Tensorflow训练BP神经网络实现鸢尾花分类
May 12 Python
Python使用华为API为图像设置多个锚点标签
Apr 12 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 计划任务 检测用户连接状态
2012/03/29 PHP
php阳历转农历优化版
2016/08/08 PHP
jquery.validate使用攻略 第一部
2010/07/01 Javascript
心扬JS分页函数代码
2010/09/10 Javascript
JavaScript实现GriwView单列全选(自写代码)
2013/05/13 Javascript
使用jquery自定义鼠标样式满足个性需求
2013/11/05 Javascript
JqueryMobile动态生成listView并实现刷新的两种方法
2014/03/05 Javascript
jQuery文件上传插件Uploadify使用指南
2014/06/05 Javascript
node.js中使用q.js实现api的promise化
2014/09/17 Javascript
onclick和onblur冲突问题的快速解决方法
2016/04/28 Javascript
模拟javascript中的sort排序(简单实例)
2016/08/17 Javascript
微信小程序中实现一对多发消息详解及实例代码
2017/02/14 Javascript
Underscore之Array_动力节点Java学院整理
2017/07/10 Javascript
原生JS 购物车及购物页面的cookie使用方法
2017/08/21 Javascript
解决vue页面刷新或者后退参数丢失的问题
2018/03/13 Javascript
React 使用browserHistory项目访问404问题解决
2018/06/01 Javascript
Vue 实现拖动滑块验证功能(只有css+js没有后台验证步骤)
2018/08/24 Javascript
小程序和web画三角形实现解析
2019/09/02 Javascript
vue实现从外部修改组件内部的变量的值
2020/07/30 Javascript
[02:32]DOTA2亚洲邀请赛 VG战队巡礼
2015/02/03 DOTA
Python中splitlines()方法的使用简介
2015/05/20 Python
pandas使用apply多列生成一列数据的实例
2018/11/28 Python
python3.x实现base64加密和解密
2019/03/28 Python
安装完Python包然后找不到模块的解决步骤
2020/02/13 Python
Myprotein意大利官网:欧洲第一运动营养品牌
2018/11/22 全球购物
工业自动化专业自荐信范文
2014/04/10 职场文书
艾滋病宣传活动总结
2014/05/08 职场文书
浪漫的婚礼主持词
2015/06/30 职场文书
学校2016年圣诞节活动总结
2016/03/31 职场文书
2016年“节能宣传周”活动总结
2016/04/05 职场文书
个人房屋租赁合同(标准范本)
2019/09/16 职场文书
导游词之云南省玉龙雪山
2019/12/19 职场文书
Vue+Element UI实现概要小弹窗的全过程
2021/05/30 Vue.js
实操Python爬取觅知网素材图片示例
2021/11/27 Python
利用 Python 的 Pandas和 NumPy 库来清理数据
2022/04/13 Python
JS轻量级函数式编程实现XDM二
2022/06/16 Javascript