上一篇文章: Python实用技法第18篇:同时对数据作转换和换算
下一篇文章: Python实用技法第20篇:针对任意多的分隔符拆分字符串
咱们有多个字典或映射,想在逻辑上将它们合并为一个单独的映射结构,以此执行一些特定的操做,好比查找值或检查键是否存在。
假设有两个字典:segmentfault
a={'x':1,'z':3} b={'y':2,'z':4}
如今假设想执行查找操做,咱们必须检查这两个字典(例如,先在a中查找,若是没作找到在去b中查找)。一种简单的方法是利用collections模块中的ChainMap类来解决这个问题。例如:code
from collections import ChainMap a={'x':1,'z':3} b={'y':2,'z':4} c=ChainMap(a,b) print(c['x']) print(c['y']) print(c['z']) print(len(c)) print(list(c.keys())) print(list(c.values())) a['z']=5 print(c['z'])
运行结果:对象
1 2 3 3 ['y', 'z', 'x'] [2, 3, 1] 5
ChainMap可接受多个映射而后在逻辑上事它们表现为一个单独的映射机构。可是,这些映射运行时并不会合并在一块儿。相反,ChainMap只是简单地维护一个记录底层映射关系的列表,而后重定义常见的字典操做来扫描这个列表。大部分的列表操做都能正常工做。例如:len、keys()、values()。字符串
若是有重复的键,那么会采用第一个映射中所对应的值。get
修改映射的操做老是会做用在列出的第一个映射结构上。例如:io
del c['x'] #能够正常删除a中的'x':1 del c['y'] #会移除,由于第一个映射结构a中没有y键
做为ChainMap的替代方案,咱们可能会考虑利用字典的update()方法将多个字典合并在一块儿,例如:import
from collections import ChainMap a={'x':1,'z':3} b={'y':2,'z':4} #为了防止b被直接修改,先cope一份b c=dict(b) print(id(c)) print(id(b)) c.update(a) print(c['x']) print(c['y']) print(c['z'])
运行结果:date
4550769400 4549694808 1 2 3
这么作行得通,可是这须要单独构建一个完整的字典对象(或者直接修改其中一个,但会破坏原始数据)。此外,若是其中任何一个原始字典作了修改,这个改变都不会反应到合并后的字典中,可是ChainMap就能够。方法
上一篇文章: Python实用技法第18篇:同时对数据作转换和换算
下一篇文章: Python实用技法第20篇:针对任意多的分隔符拆分字符串