Python如何合并多个字典或映射


Posted in Python onJuly 24, 2020

问题

现在有多个字典或者映射,你想将它们从逻辑上合并为一个单一的映射后执行某些操作,比如查找值或者检查某些键是否存在。

解决方案

加入你有如下两个字典:

a = {'x': 1, 'z': 3 }
b = {'y': 2, 'z': 4 }

现在假设你必须在两个字典中执行查找操作(比如先从a中找,如果找不到再在b中找)。一个非常简单扼解决方案就是使用collections模块中的ChainMap类。比如:

from collections import ChainMap
c = ChainMap(a,b)
print(c['x']) # Outputs 1 (from a)
print(c['y']) # Outputs 2 (from b)
print(c['z']) # Outputs 3 (from a)

讨论

一个ChainMap接受多个字典并将它们在逻辑上变为一个字典。然后,这些字典并不是真的合并在一起了,ChainMap类只是在内部创建了一个容纳这些字典的列表并重新定义了一些常见的字典操作来遍历这个列表。大部分字典操作都是可以正常使用的,比如:

>>> len(c)
3
>>> list(c.keys())
['x', 'y', 'z']
>>> list(c.values())
[1, 2, 3]
>>>

如果出现重复键,那么第一次出现的映射值会被返回。因此,例子程序中的c[‘z']总是会返回字典a中对应的值,而不是b中对应的值。

对于字典的更新或删除操作总是影响的是列表中第一个字典。比如:

>>> c['z'] = 10
>>> c['w'] = 40
>>> del c['x']
>>> a
{'w': 40, 'z': 10}
>>> del c['y']
Traceback (most recent call last):
...
KeyError: "Key not found in the first mapping: 'y'"
>>>

ChainMap对于编程语言中的作用范围变量(比如globals, locals等)是非常有用的。事实上,有一些方法可以使它变得简单:

>>> values = ChainMap()
>>> values['x'] = 1
>>> # Add a new mapping
>>> values = values.new_child()
>>> values['x'] = 2
>>> # Add a new mapping
>>> values = values.new_child()
>>> values['x'] = 3
>>> values
ChainMap({'x': 3}, {'x': 2}, {'x': 1})
>>> values['x']
3
>>> # Discard last mapping
>>> values = values.parents
>>> values['x']
2
>>> # Discard last mapping
>>> values = values.parents
>>> values['x']
1
>>> values
ChainMap({'x': 1})
>>>

作为ChainMap的替代,你可能会考虑使用update()方法将两个字典合并。比如:

>>> a = {'x': 1, 'z': 3 }
>>> b = {'y': 2, 'z': 4 }
>>> merged = dict(b)
>>> merged.update(a)
>>> merged['x']
1
>>> merged['y']
2
>>> merged['z']
3
>>>

这样也能行得通,但是它需要你创建一个完全不同的字典对象(或者是破坏现有字典结构)。同时,如果原字典做了更新,这种改变不会反应到新的合并字典中去。比如:

>>> a['x'] = 13
>>> merged['x']
1

ChianMap使用原来的字典,它自己不创建新的字典。所以它并不会产生上面所说的结果,比如:

>>> a = {'x': 1, 'z': 3 }
>>> b = {'y': 2, 'z': 4 }
>>> merged = ChainMap(a, b)
>>> merged['x']
1
>>> a['x'] = 42
>>> merged['x'] # Notice change to merged dicts
42
>>>

以上就是Python如何合并多个字典或映射的详细内容,更多关于Python 合并字典或映射的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python登录并获取CSDN博客所有文章列表代码实例
Dec 28 Python
Python基于递归和非递归算法求两个数最大公约数、最小公倍数示例
May 21 Python
nohup后台启动Python脚本,log不刷新的解决方法
Jan 14 Python
利用Python正则表达式过滤敏感词的方法
Jan 21 Python
谈谈Python中的while循环语句
Mar 10 Python
pyqt5 QProgressBar清空进度条的实例
Jun 21 Python
Python求离散序列导数的示例
Jul 10 Python
Python Tornado核心及相关原理详解
Jun 24 Python
通过Python实现Payload分离免杀过程详解
Jul 13 Python
jupyter notebook 写代码自动补全的实现
Nov 02 Python
python 详解turtle画爱心代码
Feb 15 Python
用PYTHON去计算88键钢琴的琴键频率和音高
Apr 10 Python
Matplotlib 绘制饼图解决文字重叠的方法
Jul 24 #Python
Python3.7安装pyaudio教程解析
Jul 24 #Python
python调用私有属性的方法总结
Jul 24 #Python
python中取绝对值简单方法总结
Jul 24 #Python
python代码能做成软件吗
Jul 24 #Python
深入了解Python 变量作用域
Jul 24 #Python
详解Python IO编程
Jul 24 #Python
You might like
建立文件交换功能的脚本(二)
2006/10/09 PHP
经典的PHPer为什么被认为是草根?
2007/04/02 PHP
joomla内置的表单验证功能使用方法
2010/06/11 PHP
PHP合并数组+号和array_merge的区别
2015/06/25 PHP
Symfony2函数用法实例分析
2016/03/18 PHP
JavaScript中Number.MIN_VALUE属性的使用示例
2015/06/04 Javascript
微信小程序 图片绝对定位(背景图片)
2017/04/05 Javascript
对于Javascript 执行上下文的全面了解
2017/09/05 Javascript
JavaScript数据结构之双向链表定义与使用方法示例
2017/10/27 Javascript
微信小程序实现图片预览功能
2018/01/31 Javascript
JS实现动态生成html table表格的方法分析
2018/07/11 Javascript
layui使用数据表格实现购物车功能
2019/07/26 Javascript
JavaScript逻辑运算符相关总结
2020/09/04 Javascript
[04:59]DOTA2-DPC中国联赛 正赛 Ehome vs iG 选手采访
2021/03/11 DOTA
详谈python http长连接客户端
2017/06/12 Python
Python3 中文文件读写方法
2018/01/23 Python
Python实现定制自动化业务流量报表周报功能【XlsxWriter模块】
2019/03/11 Python
python 数据生成excel导出(xlwt,wlsxwrite)代码实例
2019/08/23 Python
Python使用贪婪算法解决问题
2019/10/22 Python
keras load model时出现Missing Layer错误的解决方式
2020/06/11 Python
13个Pandas实用技巧,助你提高开发效率
2020/08/19 Python
CSS3中利用animation属性创建雪花飘落特效
2014/05/14 HTML / CSS
html5实现多图片预览上传及点击可拖拽控件
2018/03/15 HTML / CSS
美国Jeep配件购物网站:Morris 4×4 Center
2019/05/01 全球购物
Kiwi.com中国:找到特价机票并发现新目的地
2019/10/27 全球购物
转预备党员政审材料
2014/02/06 职场文书
大学生学年自我鉴定
2014/02/10 职场文书
四风自我剖析材料
2014/09/30 职场文书
2014年秘书工作总结
2014/11/25 职场文书
2015年端午节活动方案
2015/05/05 职场文书
毕业生登记表班级意见
2015/06/05 职场文书
烈士陵园观后感
2015/06/08 职场文书
七年级作文之《我和我的祖国》观后感作文
2019/10/18 职场文书
ThinkPHP5和ThinkPHP6的区别
2021/03/31 PHP
Java移除无效括号的方法实现
2021/08/07 Java/Android
mysql的Buffer Pool存储及原理
2022/04/02 MySQL