Python cookbook(数据结构与算法)将多个映射合并为单个映射的方法


Posted in Python onApril 19, 2018

本文实例讲述了Python将多个映射合并为单个映射的方法。分享给大家供大家参考,具体如下:

问题:在逻辑上将多个字典或映射合并为一个单独的映射结构,以此执行某些特定的操作,比如查找值或者检查键是否存在

解决方案:利用collections模块中的ChainMap

ChainMap可接受多个映射然后在逻辑上使它们表现为一个单独的映射结构。这些映射在字面上并不会合并在一起。相反,ChainMap只是简单地维护一个记录底层映射关系的列表,然后重定义常见的字典操作来扫描这个列表。

# example.py
#
# Example of combining dicts into a chainmap
a = {'x': 1, 'z': 3 }
b = {'y': 2, 'z': 4 }
# (a) Simple example of combining
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)
# Output some common values
print('len(c):', len(c))
print('c.keys():', list(c.keys()))
print('c.values():', list(c.values()))
# Modify some values
c['z'] = 10
c['w'] = 40
print("a:", a)
del c['x']
print("a:", a)
# Example of stacking mappings (like scopes)
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
print(values)
print(values['x'])
# Discard last mapping
values = values.parents
print(values)
print(values['x'])
# Discard last mapping
values = values.parents
print(values)
print(values['x'])
>>> ================================ RESTART ================================
>>>
1
2
3
len(c): 3
c.keys(): ['y', 'x', 'z']
c.values(): [2, 1, 3]
a: {'x': 1, 'z': 10, 'w': 40}
a: {'z': 10, 'w': 40}
ChainMap({'x': 3}, {'x': 2}, {'x': 1})
3
ChainMap({'x': 2}, {'x': 1})
2
ChainMap({'x': 1})
1
>>>

另外ChainMap操作的是原始字典,可以避免一些令人不悦的行为,例如其中任何一个原始字典的修改无法反应到合并后的字典中。

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

(代码摘自《Python Cookbook》)

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python的ORM框架SQLAlchemy入门教程
Apr 28 Python
零基础写python爬虫之打包生成exe文件
Nov 06 Python
Python中使用PIL库实现图片高斯模糊实例
Feb 08 Python
浅谈django model的get和filter方法的区别(必看篇)
May 23 Python
Python实现简单生成验证码功能【基于random模块】
Feb 10 Python
Python使用pickle模块实现序列化功能示例
Jul 13 Python
python 解决tqdm模块不能单行显示的问题
Feb 19 Python
Python查找不限层级Json数据中某个key或者value的路径方式
Feb 27 Python
使用python采集Excel表中某一格数据
May 14 Python
详解基于Facecognition+Opencv快速搭建人脸识别及跟踪应用
Jan 21 Python
聊聊pytorch测试的时候为何要加上model.eval()
May 23 Python
Python利用zhdate模块实现农历日期处理
Mar 31 Python
Python实现按照指定要求逆序输出一个数字的方法
Apr 19 #Python
一篇文章读懂Python赋值与拷贝
Apr 19 #Python
PyQt5每天必学之布局管理
Apr 19 #Python
PyQt5每天必学之创建窗口居中效果
Apr 19 #Python
PyQt5每天必学之弹出消息框
Apr 19 #Python
详谈python3中用for循环删除列表中元素的坑
Apr 19 #Python
PyQt5每天必学之关闭窗口
Apr 19 #Python
You might like
地摊中国 - 珍藏老照片
2020/08/18 杂记
咖啡语言
2021/03/03 咖啡文化
php数组中删除元素之重新索引的方法
2014/09/16 PHP
iframe自适应宽度、高度 ie6 7 8,firefox 3.86下测试通过
2010/07/29 Javascript
通过Jscript中@cc_on 语句识别IE浏览器及版本的代码
2011/05/07 Javascript
javascript实现获取cookie过期时间的变通方法
2014/08/14 Javascript
在 Express 中使用模板引擎
2015/12/10 Javascript
jQuery mobile 移动web(6)
2015/12/20 Javascript
js文件中直接alert()中文出来的是乱码的解决方法
2016/11/01 Javascript
Canvas 绘制粒子动画背景
2017/02/15 Javascript
JS控件bootstrap datepicker使用方法详解
2017/03/25 Javascript
vue与TypeScript集成配置最简教程(推荐)
2017/10/17 Javascript
Angular使用Restful的增删改
2018/12/28 Javascript
原生JavaScript写出Tabs标签页的实例代码
2020/07/20 Javascript
Vue实现指令式动态追加小球动画组件的步骤
2020/12/18 Vue.js
Python中使用ElementTree解析XML示例
2015/06/02 Python
python中numpy的矩阵、多维数组的用法
2018/02/05 Python
利用python-pypcap抓取带VLAN标签的数据包方法
2019/07/23 Python
python异常触发及自定义异常类解析
2019/08/06 Python
python爬取Ajax动态加载网页过程解析
2019/09/05 Python
python报错TypeError: ‘NoneType‘ object is not subscriptable的解决方法
2020/11/05 Python
使用css3实现的tab选项卡代码分享
2014/12/09 HTML / CSS
详解FireFox下Canvas使用图像合成绘制SVG的Bug
2019/07/10 HTML / CSS
HTML5 3D衣服摇摆动画特效
2016/03/17 HTML / CSS
eharmony澳大利亚:网上约会服务
2020/02/29 全球购物
大学生就业自我鉴定
2013/10/26 职场文书
送餐员岗位职责范本
2014/02/21 职场文书
后勤主管岗位职责
2014/03/01 职场文书
财务管理专业毕业生求职信
2014/06/02 职场文书
专题组织生活会方案
2014/06/15 职场文书
授权委托书公证
2014/09/14 职场文书
银行贷款收入证明
2014/10/17 职场文书
违反工作规定检讨书范文
2014/12/14 职场文书
2015年药店工作总结
2015/04/20 职场文书
通知的写法
2015/04/23 职场文书
为Java项目添加Redis缓存的方法
2021/05/18 Redis