在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日期操作学习笔记
Oct 07 Python
闭包在python中的应用之translate和maketrans用法详解
Aug 27 Python
跟老齐学Python之赋值,简单也不简单
Sep 24 Python
用Python进行行为驱动开发的入门教程
Apr 23 Python
Python字符串和字典相关操作的实例详解
Sep 23 Python
Python随机生成均匀分布在单位圆内的点代码示例
Nov 13 Python
Linux上使用Python统计每天的键盘输入次数
Apr 17 Python
Python一行代码实现快速排序的方法
Apr 30 Python
浅谈Python小波分析库Pywavelets的一点使用心得
Jul 09 Python
python集合的创建、添加及删除操作示例
Oct 08 Python
python3通过qq邮箱发送邮件以及附件
May 20 Python
python使用hdfs3模块对hdfs进行操作详解
Jun 06 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教程之PHP中shell脚本的使用方法分享
2012/02/23 PHP
php基于base64解码图片与加密图片还原实例
2014/11/03 PHP
ThinkPHP公共配置文件与各自项目中配置文件组合的方法
2014/11/24 PHP
基于PHP实现假装商品限时抢购繁忙的效果
2015/10/16 PHP
PHP中的使用curl发送请求(GET请求和POST请求)
2017/02/08 PHP
JavaScript的Function详细
2006/11/14 Javascript
(currentStyle)javascript为何有时用style得不到已设定的CSS的属性
2007/08/15 Javascript
div移动 输入框不能输入的问题
2009/11/19 Javascript
常用的jQuery前端技巧收集
2014/12/24 Javascript
Jquery的基本对象转换和文档加载用法实例
2015/02/25 Javascript
JavaScript动态改变表格单元格内容的方法
2015/03/30 Javascript
Js实现无刷新删除内容
2015/04/29 Javascript
JavaScript运动减速效果实例分析
2015/08/04 Javascript
基于HTML+CSS,jQuery编写的简易计算器后续(添加了键盘监听)
2016/01/05 Javascript
莱鸟介绍window.print()方法
2016/01/06 Javascript
BootStrap学习系列之Bootstrap Typeahead 组件实现百度下拉效果(续)
2016/07/07 Javascript
js模态对话框使用方法详解
2017/02/16 Javascript
基于JavaScript实现焦点图轮播效果
2017/03/27 Javascript
Vue2.0 UI框架ElementUI使用方法详解
2017/04/14 Javascript
vue实现文件上传功能
2018/08/13 Javascript
python执行等待程序直到第二天零点的方法
2015/04/23 Python
使用Python神器对付12306变态验证码
2016/01/05 Python
python 制作自定义包并安装到系统目录的方法
2018/10/27 Python
python文件拆分与重组实例
2018/12/10 Python
浅谈Tensorflow 动态双向RNN的输出问题
2020/01/20 Python
python列表返回重复数据的下标
2020/02/10 Python
全球销量第一生发产品:Viviscal
2017/12/21 全球购物
便携式太阳能系统的创新者:GOAL ZERO
2018/02/04 全球购物
澳大利亚最好的电动自行车:Leon Cycle
2020/12/19 全球购物
高中语文教学反思
2014/01/16 职场文书
法学院方阵解说词
2014/01/29 职场文书
军训自我鉴定怎么写
2014/02/13 职场文书
4s店销售经理岗位职责
2014/07/19 职场文书
党员干部对十八届四中全会的期盼
2014/10/17 职场文书
2016年5月份红领巾广播稿
2015/12/21 职场文书
干货:如何写好工作总结报告!
2019/05/10 职场文书