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

时间:2021-05-22

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

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

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

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

# example.py## Example of combining dicts into a chainmapa = {'x': 1, 'z': 3 }b = {'y': 2, 'z': 4 }# (a) Simple example of combiningfrom collections import ChainMapc = 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 valuesprint('len(c):', len(c))print('c.keys():', list(c.keys()))print('c.values():', list(c.values()))# Modify some valuesc['z'] = 10c['w'] = 40print("a:", a)del c['x']print("a:", a)# Example of stacking mappings (like scopes)values = ChainMap()values['x'] = 1# Add a new mappingvalues = values.new_child()values['x'] = 2# Add a new mappingvalues = values.new_child()values['x'] = 3print(values)print(values['x'])# Discard last mappingvalues = values.parentsprint(values)print(values['x'])# Discard last mappingvalues = values.parentsprint(values)print(values['x'])>>> ================================ RESTART ================================>>>123len(c): 3c.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})3ChainMap({'x': 2}, {'x': 1})2ChainMap({'x': 1})1>>>

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

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

(代码摘自《Python Cookbook》)

更多关于Python相关内容感兴趣的读者可查看本站专题:《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

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

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章