在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 ldap实现登录实例代码
Sep 30 Python
python使用opencv读取图片的实例
Aug 17 Python
Python实现自定义函数的5种常见形式分析
Jun 16 Python
对python当中不在本路径的py文件的引用详解
Dec 15 Python
Django ManyToManyField 跨越中间表查询的方法
Dec 18 Python
详解Appium+Python之生成html测试报告
Jan 04 Python
python多进程读图提取特征存npy
May 21 Python
flask/django 动态查询表结构相同表名不同数据的Model实现方法
Aug 29 Python
pandas实现DataFrame显示最大行列,不省略显示实例
Dec 26 Python
python爬取网易云音乐热歌榜实例代码
Aug 07 Python
Python实现JS解密并爬取某音漫客网站
Oct 23 Python
Python用tkinter实现自定义记事本的方法详解
Mar 31 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获取网络上文件
2006/10/09 PHP
PHP中一个控制字符串输出的函数
2006/10/09 PHP
实例介绍PHP的Reflection反射机制
2014/08/05 PHP
php获取QQ头像并显示的方法
2014/12/23 PHP
Laravel框架中Blade模板的用法示例
2017/08/30 PHP
PHP实现广度优先搜索算法(BFS,Broad First Search)详解
2017/09/16 PHP
PHP实现QQ登录的开原理和实现过程
2018/02/04 PHP
分享20多个很棒的jQuery 文件上传插件或教程
2011/09/04 Javascript
document.createElement()用法及注意事项(ff下不兼容)
2013/03/13 Javascript
通过一段代码简单说js中的this的使用
2013/07/23 Javascript
node.js中的fs.appendFileSync方法使用说明
2014/12/17 Javascript
JavaScript 匿名函数和闭包介绍
2015/04/13 Javascript
全面理解JavaScript中的继承(必看)
2016/06/16 Javascript
jQuery UI插件实现百度提词器效果
2016/11/21 Javascript
Vue.js系列之项目结构说明(2)
2017/01/03 Javascript
JavaScript基础心法 深浅拷贝(浅拷贝和深拷贝)
2018/03/05 Javascript
jquery实现Ajax请求的几种常见方式总结
2019/05/28 jQuery
vue实现简单的日历效果
2020/09/24 Javascript
微信小程序中button去除默认的边框实例代码
2019/08/01 Javascript
vue实现手机号码的校验实例代码(防抖函数的应用场景)
2019/09/05 Javascript
Vue 实现把表单form数据 转化成json格式的数据
2019/10/29 Javascript
Vue如何将页面导出成PDF文件
2020/08/17 Javascript
Python 除法小技巧
2008/09/06 Python
把MySQL表结构映射为Python中的对象的教程
2015/04/07 Python
Python标准库06之子进程 (subprocess包) 详解
2016/12/07 Python
Python中生成Epoch的方法
2017/04/26 Python
python操作MySQL 模拟简单银行转账操作
2017/09/27 Python
如何理解Python中的变量
2020/06/01 Python
python 爬虫基本使用——统计杭电oj题目正确率并排序
2020/10/26 Python
英国和爱尔兰的自炊式豪华度假小屋:Rural Retreats
2018/06/08 全球购物
Collection和Collections的区别
2016/05/02 面试题
医学生自荐信范文
2013/12/03 职场文书
债务授权委托书范本
2014/10/17 职场文书
防汛工作情况汇报
2014/10/28 职场文书
HTML速写之Emmet语法规则的实现
2021/04/07 HTML / CSS
php修改word的实例方法
2021/11/17 PHP