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中绑定与未绑定的类方法用法分析
Apr 29 Python
python爬虫框架scrapy实战之爬取京东商城进阶篇
Apr 24 Python
基于Python_脚本CGI、特点、应用、开发环境(详解)
May 23 Python
Python中列表list以及list与数组array的相互转换实现方法
Sep 22 Python
python验证码识别教程之利用投影法、连通域法分割图片
Jun 04 Python
使用python opencv对目录下图片进行去重的方法
Jan 12 Python
python实现批量注册网站用户的示例
Feb 22 Python
python使用Plotly绘图工具绘制散点图、线形图
Apr 02 Python
Python获取好友地区分布及好友性别分布情况代码详解
Jul 10 Python
用python写一个定时提醒程序的实现代码
Jul 22 Python
详解Selenium-webdriver绕开反爬虫机制的4种方法
Oct 28 Python
Python中Selenium对Cookie的操作方法
Jul 09 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 md5下16位和32位的实现代码
2008/04/09 PHP
php初学者写及时补给skype用户充话费的小程序
2008/11/02 PHP
PHP中多维数组的foreach遍历示例
2014/06/13 PHP
详解PHP的Yii框架中自带的前端资源包的使用
2016/03/31 PHP
Nigma vs AM BO3 第一场2.13
2021/03/10 DOTA
javascript抖动元素的小例子
2013/10/28 Javascript
jQuery实现下拉框左右选择的简单实例
2014/02/22 Javascript
jquery对table中各数据的增加、保存、删除操作示例
2014/05/14 Javascript
jQuery对指定元素中指定字符串进行替换的方法
2015/03/17 Javascript
javascript鼠标右键菜单自定义效果
2020/12/08 Javascript
js实现对table的增加行和删除行的操作方法
2016/10/13 Javascript
JS基于递归实现倒计时效果的方法
2016/11/26 Javascript
javascript 判断一个对象为数组的方法
2017/05/03 Javascript
JS实现简单获取最近7天和最近3天日期的方法
2018/04/18 Javascript
ES6基础之展开语法(Spread syntax)
2019/02/21 Javascript
说说如何利用 Node.js 代理解决跨域问题
2019/04/22 Javascript
详解Vue 如何监听Array的变化
2019/06/06 Javascript
JS实现前端动态分页码代码实例
2020/06/02 Javascript
JavaScript实现网页留言板功能
2020/11/23 Javascript
[01:11:21]DOTA2-DPC中国联赛 正赛 VG vs Elephant BO3 第一场 3月6日
2021/03/11 DOTA
python实现的简单FTP上传下载文件实例
2015/06/30 Python
详解Python在七牛云平台的应用(一)
2017/12/05 Python
Python用csv写入文件_消除空余行的方法
2018/07/06 Python
python中如何实现将数据分成训练集与测试集的方法
2019/09/13 Python
Python SSL证书验证问题解决方案
2020/01/13 Python
pytorch实现保证每次运行使用的随机数都相同
2020/02/20 Python
学习Python列表的基础知识汇总
2020/03/10 Python
python爬虫学习笔记之pyquery模块基本用法详解
2020/04/09 Python
基于nexus3配置Python仓库过程详解
2020/06/15 Python
受外贸欢迎的美国主机:BlueHost
2017/05/16 全球购物
美容院经理岗位职责
2014/04/03 职场文书
代办委托书怎么写
2014/08/01 职场文书
助学感谢信范文
2015/01/21 职场文书
大学生旷课检讨书1000字
2015/02/19 职场文书
求职自荐信怎么写
2015/03/04 职场文书
Python查找算法的实现 (线性、二分,分块、插值查找算法)
2022/04/24 Python