在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开发windows GUI程序入门实例
Oct 23 Python
python基础教程之Filter使用方法
Jan 17 Python
Python 的类、继承和多态详解
Jul 16 Python
Python实现获取nginx服务器ip及流量统计信息功能示例
May 18 Python
Python字符串的全排列算法实例详解
Jan 07 Python
Python Pillow Image Invert
Jan 22 Python
python生成带有表格的图片实例
Feb 03 Python
Python中format()格式输出全解
Apr 12 Python
解决安装pyqt5之后无法打开spyder的问题
Dec 13 Python
用python打开摄像头并把图像传回qq邮箱(Pyinstaller打包)
May 17 Python
Python3爬虫关于识别检验滑动验证码的实例
Jul 30 Python
Python可视化学习之seaborn绘制矩阵图详解
Feb 24 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和ACCESS写聊天室(六)
2006/10/09 PHP
php实现的支持断点续传的文件下载类
2014/09/23 PHP
浅析Laravel5中队列的配置及使用
2016/08/04 PHP
php array_key_exists() 与 isset() 的区别
2016/10/24 PHP
php intval函数用法总结
2019/04/14 PHP
javascript 节点排序 2
2011/01/31 Javascript
鼠标事件延时切换插件
2011/03/12 Javascript
js实现屏蔽默认快捷键调用自定义事件示例
2013/06/18 Javascript
ES6中字符串string常用的新增方法小结
2017/11/07 Javascript
ES6中javascript实现函数绑定及类的事件绑定功能详解
2017/11/08 Javascript
nodeJS模块简单用法示例
2018/04/21 NodeJs
Webpack的dll功能使用
2018/06/28 Javascript
微信小程序项目实践之九宫格实现及item跳转功能
2018/07/19 Javascript
Vue常用指令详解分析
2018/08/19 Javascript
Python实现基于多线程、多用户的FTP服务器与客户端功能完整实例
2017/08/18 Python
Python基础教程之利用期物处理并发
2018/03/29 Python
pandas 小数位数 精度的处理方法
2018/06/09 Python
对python遍历文件夹中的所有jpg文件的实例详解
2018/12/08 Python
python调用自定义函数的实例操作
2019/06/26 Python
pandas进行时间数据的转换和计算时间差并提取年月日
2019/07/06 Python
django多对多表的创建,级联删除及手动创建第三张表
2019/07/25 Python
python随机模块random使用方法详解
2020/02/14 Python
Python调用接口合并Excel表代码实例
2020/03/31 Python
Python如何读取、写入JSON数据
2020/07/28 Python
南非领先的在线旅行社:Travelstart南非
2016/09/04 全球购物
全球性的奢侈品梦工厂:Forzieri(福喜利)
2019/02/20 全球购物
Farfetch阿联酋:奢侈品牌时尚购物平台
2019/07/26 全球购物
大学自荐信
2013/12/12 职场文书
创意活动策划书
2014/01/15 职场文书
大学生职业生涯规划书模板
2014/01/18 职场文书
经典婚礼主持开场白
2014/03/13 职场文书
十佳好少年事迹材料
2014/08/21 职场文书
缓刑人员思想汇报
2014/10/11 职场文书
买房子个人收入证明
2014/10/12 职场文书
MySQL分库分表与分区的入门指南
2021/04/22 MySQL
HTML中的表单Form实现居中效果
2021/05/25 HTML / CSS