在Python中合并字典模块ChainMap的隐藏坑【推荐】


Posted in Python onJune 27, 2019

在Python中,当我们有两个字典需要合并的时候,可以使用字典的 update 方法,例如:

a = {'a': 1, 'b': 2}
b = {'x': 3, 'y': 4}
a.update(b)
print(a)

运行效果如下图所示:

在Python中合并字典模块ChainMap的隐藏坑【推荐】

然而,这个方法有一个问题——它会改变其中一个字典。如果我们不想改变原有的两个字典,那么我们必需要单独再创建一个字典:

a = {'a': 1, 'b': 2}
b = {'x': 3, 'y': 4}
c = dict(a)
c.update(b)
print(c)
print(a)

在Python中合并字典模块ChainMap的隐藏坑【推荐】

如果原来的两个字典非常大,那么这种方式将会浪费大量的内存。

无论是直接修改原有的其中一个字典,还是创建另一个字典,这两种方案都有点缺陷。那么有没有既不修改原有字典,又不另外创建一个新的字典的方法呢?

答案就是 collections 模块下面的 ChainMap

使用 ChainMap 可以把多个字典合并成一个 ChainMap 对象。读写这个对象就像是读字典一样。

例如:

from collections import ChainMap
a = {'a': 1, 'b': 2}
b = {'x': 3, 'y': 4}
c = ChainMap(a, b)
print(c['a'])
print(c['y'])

运行效果如下图所示:

在Python中合并字典模块ChainMap的隐藏坑【推荐】

不仅可以“合并”两个字典, ChainMap 可以接受任意多个字典,并把他们全都合在一起:

from collections import ChainMap
a = {'a': 1, 'b': 2}
b = {'x': 3, 'y': 4}
c = {'z': 5, 'w': 6}
d = {'m': 7, 'h': 8, 'k': 9}
e = ChainMap(a, b, c, d)
print(e['a'], e['y'], e['z'], e['k'])

运行效果如下图所示:

在Python中合并字典模块ChainMap的隐藏坑【推荐】

ChainMap 不会真的把字典合并在一起,而是在内部储存一个Key到每个字典的映射,当你读取 e[key] 的时候,它先去查询这个key在哪个字典里面,然后再去对应的字典里面查询对应的值。所以使用ChainMap几乎不需要额外的内存空间(当前这个对象自己会占用一些空间,但是如果要合并大字典,那么它自己占用的空间几乎可以忽略)。

所以你是不是觉得使用 ChainMap 就能实现完美合并字典了呢?

在使用它之前,你一定要理解它的运行原理。如果你理解了它的运行原理,那么下面几个问题,你在运行代码之前就会知道结果是什么:

如果两个字典里面有一个Key的名字相同,那么使用ChainMap以后会读取哪一个? 如果为ChainMap对象添加一个Key-Value对,那么这个值会添加到哪里? 如果从原字典里面删除一个Key,ChainMap对象里面的Key也会消失吗? 如果从ChainMap对象里面删除一个Key,那么原字典里面的Key会消失吗?

首先来说第一个问题的答案:

ChainMap 对象会使用第一个拥有这个Key的字典里面的值,如下图所示:

在Python中合并字典模块ChainMap的隐藏坑【推荐】

第二个问题,新的Key-Value会被添加进第一个字典里面,如下图所示:

在Python中合并字典模块ChainMap的隐藏坑【推荐】

第三个问题,如果修改了原来的字典,那么 ChainMap 对象也会相应更新:

在Python中合并字典模块ChainMap的隐藏坑【推荐】

第四个问题,如果这个Key只在一个源字典中存在,那么这个Key会被从源字典中删除。如果这个Key在多个字典中都存在,那么Key会被从第一个字典中删除。当被从第一个字典中删除以后,第二个源字典的Key可以继续被 ChainMap 读取。

在Python中合并字典模块ChainMap的隐藏坑【推荐】

以上4点,在你使用 ChainMap 的时候一定要牢记,否则可能会导致你发现不了的Bug。 

 总结

以上所述是小编给大家介绍的在Python中合并字典模块ChainMap的隐藏坑,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Python 相关文章推荐
Python中强大的命令行库click入门教程
Dec 26 Python
Python3中的列表生成式、生成器与迭代器实例详解
Jun 11 Python
Python3导入CSV文件的实例(跟Python2有些许的不同)
Jun 22 Python
django用户登录和注销的实现方法
Jul 16 Python
Python之使用adb shell命令启动应用的方法详解
Jan 07 Python
微信小程序python用户认证的实现
Jul 29 Python
python中树与树的表示知识点总结
Sep 14 Python
Pytorch训练过程出现nan的解决方式
Jan 02 Python
python 通过文件夹导入包的操作
Jun 01 Python
python3 os进行嵌套操作的实例讲解
Nov 19 Python
Pyqt5将多个类组合在一个界面显示的完整示例
Sep 04 Python
pandas进行数据输入和输出的方法详解
Mar 23 Python
python 反编译exe文件为py文件的实例代码
Jun 27 #Python
Python 使用PyQt5 完成选择文件或目录的对话框方法
Jun 27 #Python
Python提取转移文件夹内所有.jpg文件并查看每一帧的方法
Jun 27 #Python
对python3 sort sorted 函数的应用详解
Jun 27 #Python
python 批量解压压缩文件的实例代码
Jun 27 #Python
python opencv 图像拼接的实现方法
Jun 27 #Python
python实现鸢尾花三种聚类算法(K-means,AGNES,DBScan)
Jun 27 #Python
You might like
php 保留小数点
2009/04/21 PHP
php中{}大括号是什么意思
2013/12/01 PHP
IE和Firefox下javascript的兼容写法小结
2008/12/10 Javascript
javascript void(0)的妙用
2009/10/21 Javascript
改善你的jQuery的25个步骤 千倍级效率提升
2010/02/11 Javascript
IE、FF浏览器下修改标签透明度
2014/01/28 Javascript
JavaScript 浏览器对象模型BOM使用介绍
2015/04/13 Javascript
jquery自定义表单验证插件
2016/10/12 Javascript
JavaScript利用正则表达式替换字符串中的内容
2016/12/12 Javascript
详解Angular2 之 结构型指令
2017/06/21 Javascript
浅谈ajax请求不同页面的微信JSSDK问题
2018/02/26 Javascript
微信小程序画布圆形进度条显示效果
2020/11/17 Javascript
原生JS实现的轮播图功能详解
2018/08/06 Javascript
mpvue性能优化实战技巧(小结)
2019/04/17 Javascript
JavaScript学习教程之cookie与webstorage
2019/06/23 Javascript
vue.js实现数据库的JSON数据输出渲染到html页面功能示例
2019/08/03 Javascript
js实现旋转的星空效果
2019/11/01 Javascript
聊聊Vue中provide/inject的应用详解
2019/11/10 Javascript
js实现购物车商品数量加减
2020/09/21 Javascript
EXTJS7实现点击拖拉选择文本
2020/12/17 Javascript
[47:36]Optic vs Newbee 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
[01:14:31]Secret vs VG 2018国际邀请赛淘汰赛BO3 第一场 8.23
2018/08/24 DOTA
Python中unittest用法实例
2014/09/25 Python
Python 图像处理: 生成二维高斯分布蒙版的实例
2019/07/04 Python
python networkx 根据图的权重画图实现
2019/07/10 Python
python Tensor和Array对比分析
2020/01/08 Python
一款纯css3实现的圆形旋转分享按钮旋转角度可自己调整
2014/09/02 HTML / CSS
菲律宾酒店预订网站:Hotels.com菲律宾
2017/07/12 全球购物
英国蜡烛、蜡烛配件和家居香氛购买网站:Yankee Candle
2018/12/12 全球购物
中学实习教师自我鉴定
2013/12/12 职场文书
服装厂厂长岗位职责
2013/12/27 职场文书
大学生创业策划书
2014/02/02 职场文书
教师对学生的寄语
2014/04/03 职场文书
美术课外活动总结
2014/07/08 职场文书
少先队中队工作总结2015
2015/07/23 职场文书
Python实现Hash算法
2022/03/18 Python