在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中subprocess的简单使用示例
Jul 28 Python
Python中的变量和作用域详解
Jul 13 Python
详解supervisor使用教程
Nov 21 Python
python正则表达式爬取猫眼电影top100
Feb 24 Python
浅谈python正则的常用方法 覆盖范围70%以上
Mar 14 Python
Python排序算法之选择排序定义与用法示例
Apr 29 Python
python使用循环打印所有三位数水仙花数的实例
Nov 13 Python
对python中基于tcp协议的通信(数据传输)实例讲解
Jul 22 Python
python数据预处理 :数据抽样解析
Feb 24 Python
配置python的编程环境之Anaconda + VSCode的教程
Mar 29 Python
PyChon中关于Jekins的详细安装(推荐)
Dec 28 Python
Python内置的数据类型及使用方法
Apr 13 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
javascript some()函数用法详解
2014/11/13 PHP
php提示Warning:mysql_fetch_array() expects的解决方法
2014/12/16 PHP
php中magic_quotes_gpc对unserialize的影响分析
2014/12/16 PHP
thinkPHP模板中for循环与switch语句用法示例
2016/11/30 PHP
php 删除指定文件夹的实例讲解
2017/07/25 PHP
centos7上编译安装php7以php-fpm方式连接apache
2018/11/08 PHP
input、button的不同type值在ajax提交表单时导致的陷阱
2009/02/24 Javascript
js 表格隔行颜色
2009/12/02 Javascript
jquery刷新页面的实现代码(局部及全页面刷新)
2011/07/11 Javascript
JS操作CSS随机改变网页背景实现思路
2014/03/10 Javascript
鼠标事件的screenY,pageY,clientY,layerY,offsetY属性详解
2015/03/12 Javascript
JS去除iframe滚动条的方法
2015/04/01 Javascript
jQuery实现判断滚动条到底部
2015/06/23 Javascript
限制只能输入数字的实现代码
2016/05/16 Javascript
利用node.js爬取指定排名网站的JS引用库详解
2017/07/25 Javascript
推荐VSCode 上特别好用的 Vue 插件之vetur
2017/09/14 Javascript
Vue点击切换颜色的方法
2018/09/13 Javascript
html+jQuery实现拖动滑块图片拼图验证码插件【移动端适用】
2019/09/10 jQuery
详解vue3中组件的非兼容变更
2021/03/03 Vue.js
[49:05]Newbee vs TNC 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python学习之Anaconda的使用与配置方法
2018/01/04 Python
分数霸榜! python助你微信跳一跳拿高分
2018/01/08 Python
详解python的ORM中Pony用法
2018/02/09 Python
python2.7安装图文教程
2018/03/13 Python
python线程的几种创建方式详解
2019/08/29 Python
Pandas实现一列数据分隔为两列
2020/05/18 Python
python Matplotlib数据可视化(2):详解三大容器对象与常用设置
2020/09/30 Python
深入浅析CSS3中的Flex布局整理
2020/04/27 HTML / CSS
MATCHESFASHION.COM法国官网:英国奢侈品零售商
2018/01/04 全球购物
内部类的定义、种类以及优点
2013/10/16 面试题
面试求职的个人自我评价
2013/11/16 职场文书
科学发展观标语
2014/10/08 职场文书
批评与自我批评总结
2014/10/17 职场文书
组织生活会表态发言材料
2014/10/17 职场文书
国际贸易实训总结
2015/08/03 职场文书
使用pytorch实现线性回归
2021/04/11 Python