本文摘自php中文网,作者Guanhui,侵删。

问题
现在有多个字典或者映射,你想将它们从逻辑上合并为一个单一的映射后执行某些操作,比如查找值或者检查某些键是否存在。
解决方案
加入你有如下两个字典:
1 2 | a = { 'x' : 1 , 'z' : 3 }
b = { 'y' : 2 , 'z' : 4 }
|
现在假设你必须在两个字典中执行查找操作(比如先从a中找,如果找不到再在b中找)。一个非常简单扼解决方案就是使用collections模块中的ChainMap类。比如:
1 2 3 4 5 | from collections import ChainMap
c = ChainMap(a,b)
print (c[ 'x' ])
print (c[ 'y' ])
print (c[ 'z' ])
|
讨论
一个ChainMap接受多个字典并将它们在逻辑上变为一个字典。然后,这些字典并不是真的合并在一起了,ChainMap类只是在内部创建了一个容纳这些字典的列表并重新定义了一些常见的字典操作来遍历这个列表。大部分字典操作都是可以正常使用的,比如:
1 2 3 4 5 6 7 | >>> len (c)
3
>>> list (c.keys())
[ 'x' , 'y' , 'z' ]
>>> list (c.values())
[ 1 , 2 , 3 ]
>>>
|
如果出现重复键,那么第一次出现的映射值会被返回。因此,例子程序中的c[‘z']总是会返回字典a中对应的值,而不是b中对应的值。
对于字典的更新或删除操作总是影响的是列表中第一个字典。比如:
1 2 3 4 5 6 7 8 9 10 | >>> 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等)是非常有用的。事实上,有一些方法可以使它变得简单:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | >>> values = ChainMap()
>>> values[ 'x' ] = 1
>>>
>>> values = values.new_child()
>>> values[ 'x' ] = 2
>>>
>>> values = values.new_child()
>>> values[ 'x' ] = 3
>>> values
ChainMap({ 'x' : 3 }, { 'x' : 2 }, { 'x' : 1 })
>>> values[ 'x' ]
3
>>>
>>> values = values.parents
>>> values[ 'x' ]
2
>>>
>>> values = values.parents
>>> values[ 'x' ]
1
>>> values
ChainMap({ 'x' : 1 })
>>>
|
作为ChainMap的替代,你可能会考虑使用update()方法将两个字典合并。比如:
1 2 3 4 5 6 7 8 9 10 11 | >>> 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
>>>
|
这样也能行得通,但是它需要你创建一个完全不同的字典对象(或者是破坏现有字典结构)。同时,如果原字典做了更新,这种改变不会反应到新的合并字典中去。比如:
1 2 3 | >>> a[ 'x' ] = 13
>>> merged[ 'x' ]
1
|
ChianMap使用原来的字典,它自己不创建新的字典。所以它并不会产生上面所说的结果,比如:
1 2 3 4 5 6 7 8 9 | >>> a = { 'x' : 1 , 'z' : 3 }
>>> b = { 'y' : 2 , 'z' : 4 }
>>> merged = ChainMap(a, b)
>>> merged[ 'x' ]
1
>>> a[ 'x' ] = 42
>>> merged[ 'x' ]
42
>>>
|
推荐教程:《Python教程》
以上就是Python 合并多个字典或映射教程的详细内容,更多文章请关注木庄网络博客!!
相关阅读 >>
Python如何使用lxml来读写xml格式文件的实例分享
Python中高阶函数实现剪枝函数的方法
Python语言属于汇编语言吗?
Python教程之select模块介绍
Python 关于反射和类的特殊成员方法
Python中的字典排序如何实现代码说明
Python 列表解析
vscode无法调试Python怎么解决
Python列表中函数&方法详解
selenium+Python如何爬取简书网站
更多相关阅读请进入《Python》频道 >>
人民邮电出版社
python入门书籍,非常畅销,超高好评,python官方公认好书。
转载请注明出处:木庄网络博客 » Python 合并多个字典或映射教程