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实现根据IP地址和子网掩码算出网段的方法
Jul 30 Python
Python实现的选择排序算法原理与用法实例分析
Nov 22 Python
python+matplotlib实现动态绘制图片实例代码(交互式绘图)
Jan 20 Python
python模块smtplib学习
May 22 Python
Django项目创建到启动详解(最全最详细)
Sep 07 Python
python创建n行m列数组示例
Dec 02 Python
Python3.9又更新了:dict内置新功能
Feb 28 Python
python读取配置文件方式(ini、yaml、xml)
Apr 09 Python
python中random.randint和random.randrange的区别详解
Sep 20 Python
基于OpenCV的网络实时视频流传输的实现
Nov 15 Python
matplotlib grid()设置网格线外观的实现
Feb 22 Python
python Tkinter模块使用方法详解
Apr 07 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
PHP类中Static方法效率测试代码
2010/10/17 PHP
wordpress自定义url参数实现路由功能的代码示例
2013/11/28 PHP
PHP中替换键名的简易方法示例详解
2014/01/07 PHP
ecshop后台编辑器替换成ueditor编辑器
2015/03/03 PHP
php5.4以上版本GBK编码下htmlspecialchars输出为空问题解决方法汇总
2015/04/03 PHP
php fread读取文件注意事项
2016/09/24 PHP
Laravel Intervention/image图片处理扩展包的安装、使用与可能遇到的坑详解
2017/11/14 PHP
js 数组克隆方法 小结
2010/03/20 Javascript
基于jQuery的让非HTML5浏览器支持placeholder属性的代码
2011/05/24 Javascript
基于jquery打造的百分比动态色彩条插件
2012/09/19 Javascript
关于使用 jBox 对话框的提交不能弹出问题解决方法
2012/11/07 Javascript
jQuery的slideToggle方法实例
2013/05/07 Javascript
原生javascript兼容性测试实例
2013/07/01 Javascript
jquery插件jquery倒计时插件分享
2013/12/27 Javascript
ArtEditor富文本编辑器增加表单提交功能
2016/04/18 Javascript
jquery 动态增加删除行的简单实例(推荐)
2016/10/12 Javascript
JS基于正则表达式的替换操作(replace)用法示例
2017/04/28 Javascript
在Vue组件中使用 TypeScript的方法
2018/02/28 Javascript
Vue实现页面添加水印功能
2019/11/09 Javascript
[02:36]DOTA2亚洲邀请赛小组赛精彩集锦:EE凭借法力虚空拿下4杀
2017/03/30 DOTA
pygame加载中文名mp3文件出现error
2017/03/31 Python
python opencv 图像尺寸变换方法
2018/04/02 Python
python实现读Excel写入.txt的方法
2018/04/29 Python
使用python将大量数据导出到Excel中的小技巧分享
2018/06/14 Python
Python实现带下标索引的遍历操作示例
2019/05/30 Python
python conda操作方法
2019/09/11 Python
Python基于正则表达式实现计算器功能
2020/07/13 Python
Python 实现国产SM3加密算法的示例代码
2020/09/21 Python
python入门教程之基本算术运算符
2020/11/13 Python
Python基于mediainfo批量重命名图片文件
2020/12/29 Python
阿迪达斯德国官方网站:adidas德国
2017/07/12 全球购物
eharmony澳大利亚:网上约会服务
2020/02/29 全球购物
中兴通讯全球官方网站:ZTE
2020/12/26 全球购物
麦当劳辞职信范文
2014/01/18 职场文书
缅怀先烈演讲稿
2014/09/03 职场文书
微信小程序 WeUI扩展组件库的入门教程
2022/04/21 Javascript