在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文件和目录操作详解
Feb 08 Python
python实现备份目录的方法
Aug 03 Python
Python 描述符(Descriptor)入门
Nov 20 Python
Python实现的破解字符串找茬游戏算法示例
Sep 25 Python
python如何使用正则表达式的前向、后向搜索及前向搜索否定模式详解
Nov 08 Python
Python日期时间模块datetime详解与Python 日期时间的比较,计算实例代码
Sep 14 Python
Python可视化mhd格式和raw格式的医学图像并保存的方法
Jan 24 Python
Python实现的微信支付方式总结【三种方式】
Apr 13 Python
django数据关系一对多、多对多模型、自关联的建立
Jul 24 Python
Python SELENIUM上传文件或图片实现过程
Oct 28 Python
python实现在线翻译功能
Mar 03 Python
使用Pytorch训练two-head网络的操作
May 28 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 mysql数据库操作类
2008/06/04 PHP
php实现对象克隆的方法
2015/06/20 PHP
PHP图形计数器程序显示网站用户浏览量
2016/07/20 PHP
PHP GD库相关图像生成和处理函数小结
2016/09/30 PHP
Laravel5中防止XSS跨站攻击的方法
2016/10/10 PHP
PHP实现中国公民身份证号码有效性验证示例代码
2017/05/03 PHP
js 实现在离开页面时提醒未保存的信息(减少用户重复操作)
2013/01/16 Javascript
JavaScript中document对象使用详解
2015/01/06 Javascript
javascript求日期差的方法
2016/03/02 Javascript
深入浅析javascript中的作用域(推荐)
2016/07/19 Javascript
JS声明对象时属性名加引号与不加引号的问题及解决方法
2018/02/16 Javascript
深入剖析Node.js cluster模块
2018/05/23 Javascript
JQuery属性操作与循环用法示例
2019/05/15 jQuery
Vue2.x通用编辑组件的封装及应用详解
2019/05/28 Javascript
解决vue初始化项目时,一直卡在Project description上的问题
2019/10/31 Javascript
解决antd的Form组件setFieldsValue的警告问题
2020/10/29 Javascript
[46:53]Secret vs Liquid 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
Python实现的简单万年历例子分享
2014/04/25 Python
Python系统监控模块psutil功能与经典用法分析
2018/05/24 Python
通过Pandas读取大文件的实例
2018/06/07 Python
Python读取mat文件,并转为csv文件的实例
2018/07/04 Python
python实现任意位置文件分割的实例
2018/12/14 Python
介绍一款python类型检查工具pyright(推荐)
2019/07/03 Python
python验证码图片处理(二值化)
2019/11/01 Python
python 监控服务器是否有人远程登录(详细思路+代码)
2020/12/18 Python
HTML5 新标签全部总汇(推荐)
2016/06/13 HTML / CSS
荷兰演唱会和体育比赛订票网站:viagogo荷兰
2018/04/08 全球购物
伦敦著名的运动鞋综合商店:Footpatrol
2019/03/25 全球购物
阿拉伯时尚购物网站:Nisnass
2021/02/07 全球购物
介绍一下代理模式(Proxy)
2014/10/17 面试题
《水乡歌》教学反思
2014/04/24 职场文书
医院党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
社会工作专业自荐信
2014/09/26 职场文书
《扇形统计图》教学反思
2016/02/17 职场文书
八年级作文之我的母亲
2019/12/10 职场文书
mysql获取指定时间段中所有日期或月份的语句(不设存储过程,不加表)
2021/06/18 MySQL