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解析xml文件操作实例
Oct 05 Python
Python列表生成器的循环技巧分享
Mar 06 Python
python的构建工具setup.py的方法使用示例
Oct 23 Python
Python探索之SocketServer详解
Oct 28 Python
对Python中gensim库word2vec的使用详解
May 08 Python
python得到qq句柄,并显示在前台的方法
Oct 14 Python
python 实现快速生成连续、随机字母列表
Nov 28 Python
python读取yaml文件后修改写入本地实例
Apr 27 Python
使用pyecharts1.7进行简单的可视化大全
May 17 Python
python + selenium 刷B站播放量的实例代码
Jun 12 Python
Python类成员继承重写的实现
Sep 16 Python
Python使用for生成列表实现过程解析
Sep 22 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扩展迁移为PHP7扩展兼容性问题记录
2016/02/15 PHP
PHP读取并输出XML文件数据的简单实现方法
2017/12/22 PHP
PHP+mysql防止SQL注入的方法小结
2019/04/27 PHP
使用IE的地址栏来辅助调试Web页脚本
2007/03/08 Javascript
Jquery作者John Resig自己封装的javascript 常用函数
2009/11/09 Javascript
jQuery数据类型小结(14个)
2016/01/08 Javascript
js操作XML文件的实现方法兼容IE与FireFox
2016/06/25 Javascript
浅谈javascript控制HTML5的全屏操控,浏览器兼容的问题
2016/10/10 Javascript
jQuery实现隔行变色的方法分析(对比原生JS)
2016/11/18 Javascript
js实现textarea限制输入字数
2017/02/13 Javascript
js实现数组去重方法及效率?Ρ? target=
2017/02/14 Javascript
微信小程序 图片上传实例详解
2017/05/05 Javascript
vue2组件之select2调用的示例代码
2017/10/12 Javascript
微信小程序图片轮播组件gallery slider使用方法详解
2018/01/31 Javascript
Vue使用高德地图搭建实时公交应用功能(地图 + 附近站点+线路详情 + 输入提示+换乘详情)
2018/05/16 Javascript
JavaScript 点击触发复制功能实例详解
2018/11/02 Javascript
JS实现点击按钮随机生成可拖动的不同颜色块示例
2019/01/30 Javascript
Vue项目中使用WebUploader实现文件上传的方法
2019/07/21 Javascript
Node.js API详解之 assert模块用法实例分析
2020/05/26 Javascript
vue动态设置页面title的方法实例
2020/08/23 Javascript
[45:34]完美世界DOTA2联赛PWL S3 Rebirth vs CPG 第一场 12.18
2020/12/19 DOTA
[09:13]DOTA2-DPC中国联赛 正赛 Ehome vs Magma 选手采访 1月19日
2021/03/11 DOTA
只需7行Python代码玩转微信自动聊天
2019/01/27 Python
浅谈python的深浅拷贝以及fromkeys的用法
2019/03/08 Python
Windows系统Python直接调用C++ DLL的方法
2019/08/01 Python
使用Python为中秋节绘制一块美味的月饼
2019/09/11 Python
10个Python面试常问的问题(小结)
2019/11/20 Python
Python pandas库中的isnull()详解
2019/12/26 Python
python如何随机生成高强度密码
2020/08/19 Python
如何在python中处理配置文件代码实例
2020/09/27 Python
澳大利亚手表品牌:Time IV Change
2018/10/06 全球购物
英国地毯卖家:The Rug Seller
2019/07/18 全球购物
群众路线专项整治工作情况报告
2014/10/28 职场文书
2015年入党决心书
2015/02/05 职场文书
致我们终将逝去的青春观后感
2015/06/10 职场文书
JavaScript中时间格式化新思路toLocaleString()
2021/11/07 Javascript