本文实例讲述了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函数使用技巧总结》、《python字符串操作技巧汇总》、《python入门与进阶经典教程》及《python文件与目录操作技巧汇总》
希望本文所述对大家python程序设计有所帮助。
声明:本文内容来源于网络,九游会下载的版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌九游会下载的版权的内容,欢迎发送邮件至:notice#www.elefans.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。