在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实现根据月份和日期得到星座的方法
Mar 27 Python
使用基于Python的Tornado框架的HTTP客户端的教程
Apr 24 Python
python实现微信跳一跳辅助工具步骤详解
Jan 04 Python
详解Python自建logging模块
Jan 29 Python
在PyCharm环境中使用Jupyter Notebook的两种方法总结
May 24 Python
python多进程控制学习小结
Oct 31 Python
selenium获取当前页面的url、源码、title的方法
Jun 12 Python
在Django中实现添加user到group并查看
Nov 18 Python
Django与pyecharts结合的实例代码
May 13 Python
python中JWT用户认证的实现
May 18 Python
详解python UDP 编程
Aug 24 Python
python数字图像处理之图像的批量处理
Jun 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 curl模拟浏览器采集阿里巴巴的实现代码
2011/04/20 PHP
php object转数组示例
2014/01/15 PHP
ThinkPHP CURD方法之data方法详解
2014/06/18 PHP
Laravel5.1数据库连接、创建数据库、创建model及创建控制器的方法
2016/03/29 PHP
PHP PDOStatement::bindColumn讲解
2019/01/30 PHP
Confirmer JQuery确认对话框组件
2010/06/09 Javascript
javascript中的数字与字符串相加实例分析
2011/08/14 Javascript
jquery click([data],fn)使用方法实例介绍
2013/07/08 Javascript
基于bootstrap3和jquery的分页插件
2015/07/31 Javascript
Javascript数组Array基础介绍
2016/03/13 Javascript
Easyui Treegrid改变默认图标的方法
2016/04/29 Javascript
Vue项目中跨域问题解决方案
2018/06/05 Javascript
对vue2.0中.vue文件页面跳转之.$router.push的用法详解
2018/08/24 Javascript
详解Node.js amqplib 连接 Rabbit MQ最佳实践
2019/01/24 Javascript
JavaScript自动生成 年月范围 选择功能完整示例【基于jQuery插件】
2019/09/03 jQuery
Vue 数组和对象更新,但是页面没有刷新的解决方式
2019/11/09 Javascript
Python2.6版本中实现字典推导 PEP 274(Dict Comprehensions)
2015/04/28 Python
python在linux系统下获取系统内存使用情况的方法
2015/05/11 Python
对python列表里的字典元素去重方法详解
2019/01/21 Python
python从zip中删除指定后缀文件(推荐)
2019/12/05 Python
python 实现批量替换文本中的某部分内容
2019/12/13 Python
jupyter notebook快速入门及使用详解
2020/11/13 Python
python中的对数log函数表示及用法
2020/12/09 Python
adidas瑞典官方网站:购买阿迪达斯鞋子和运动服
2019/12/11 全球购物
20岁生日感言
2014/01/13 职场文书
新护士岗前培训制度
2014/02/02 职场文书
出纳会计岗位职责
2014/03/12 职场文书
平面设计专业求职信
2014/08/09 职场文书
党的群众路线教育实践活动查摆问题自查报告
2014/10/10 职场文书
2014年驻村干部工作总结
2014/11/17 职场文书
2015年化验员工作总结
2015/04/10 职场文书
高一地理教学工作总结
2015/08/12 职场文书
2016学校先进集体事迹材料
2016/02/29 职场文书
MySQL 如何设计统计数据表
2021/06/15 MySQL
深入浅析python3 依赖倒置原则(示例代码)
2021/07/09 Python
Python中非常使用的6种基本变量的操作与技巧
2022/03/22 Python