在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批量同步web服务器代码核心程序
Sep 01 Python
Python实现好友全头像的拼接实例(推荐)
Jun 24 Python
python实现淘宝秒杀聚划算抢购自动提醒源码
Jun 23 Python
Python3 实现随机生成一组不重复数并按行写入文件
Apr 09 Python
python实现音乐下载器
Apr 15 Python
Python基于Floyd算法求解最短路径距离问题实例详解
May 16 Python
使用Python实现跳帧截取视频帧
May 31 Python
python 类的继承 实例方法.静态方法.类方法的代码解析
Aug 23 Python
python中的函数递归和迭代原理解析
Nov 14 Python
python数据库操作mysql:pymysql、sqlalchemy常见用法详解
Mar 30 Python
Python如何解除一个装饰器
Aug 07 Python
详解Python为什么不用设计模式
Jun 24 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数据集构建JSON格式及新数组的方法
2012/11/07 PHP
php命令行使用方法和命令行参数说明
2014/04/08 PHP
Yii2.0高级框架数据库增删改查的一些操作
2015/11/16 PHP
PHP abstract 抽象类定义与用法示例
2018/05/29 PHP
JQUERY的属性选择符和自定义选择符使用方法(二)
2011/04/07 Javascript
jquery Mobile入门—外部链接切换示例代码
2013/01/08 Javascript
location.href用法总结(最主要的)
2013/12/27 Javascript
js实现九宫格图片半透明渐显特效的方法
2015/02/16 Javascript
jQuery插件zoom实现图片全屏放大弹出层特效
2015/04/15 Javascript
浅谈javascript中return语句
2015/07/15 Javascript
深入理解JavaScript中为什么string可以拥有方法
2016/05/24 Javascript
AngularJS下对数组的对比分析
2016/08/24 Javascript
Sortable.js拖拽排序使用方法解析
2016/11/04 Javascript
jQuery内存泄露解决办法
2016/12/13 Javascript
详解Angular2 关于*ngFor 嵌套循环
2017/05/22 Javascript
基于vue cli 通过命令行传参实现多环境配置
2018/07/12 Javascript
swiper.js插件实现pc端文本上下滑动功能示例
2018/12/03 Javascript
使用Angular自定义字段校验指令的方法示例
2019/02/01 Javascript
小程序实现列表多个批量倒计时
2021/01/29 Javascript
JavaScript事件冒泡机制原理实例解析
2020/01/14 Javascript
Javascript实现秒表计时游戏
2020/05/27 Javascript
[01:21]DOTA2 新英雄 森海飞霞
2020/12/18 DOTA
Scrapy框架爬取西刺代理网免费高匿代理的实现代码
2019/02/22 Python
python实现接口并发测试脚本
2019/06/25 Python
解决python web项目意外关闭,但占用端口的问题
2019/12/17 Python
Python读取配置文件(config.ini)以及写入配置文件
2020/04/08 Python
如何实现更换Jupyter Notebook内核Python版本
2020/05/18 Python
结束运行python的方法
2020/06/16 Python
Python爬虫之Spider类用法简单介绍
2020/08/04 Python
python+flask编写一个简单的登录接口
2020/11/13 Python
java字符串格式化输出实例讲解
2021/01/06 Python
HTML5重塑Web世界它将如何改变互联网
2012/12/17 HTML / CSS
SK-II神仙水美国官网:SK-II美国
2020/02/25 全球购物
保护动物倡议书
2014/04/15 职场文书
领导欢迎词范文
2015/01/26 职场文书
golang中的空接口使用详解
2021/03/30 Python