Python: 合並多個字典


現在有多個字典或者映射,想將它們從邏輯上合並為一個單一的映射后執行某些操作,比如查找值或者檢查某些鍵是否存在。

eg1:


a = {'x': 1, 'z': 3 }
b = {'y': 2, 'z': 4 }


在兩個字典中執行查找操作(比如先從a 中找,如果找不到再在b中找)。一個非常簡單的解決方案就是使用collections 模塊中的ChainMap 類
>>>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)

一個ChainMap 接受多個字典並將它們在邏輯上變為一個字典。然后,這些字典並不是真的合並在一起了, ChainMap 類只是在內部創建了一個容納這些字典的列表並重新定義了一些常見的字典操作來遍歷這個列表。大部分字典操作都是可以正常使用的,比如:
>>> len(c)
3
>>> list(c.keys())
['x', 'y', 'z']
>>> list(c.values())
[1, 2, 3]

如果出現重復鍵,那么第一次出現的映射值會被返回。因此,例子程序中的c['z']總是會返回字典a 中對應的值,而不是b 中對應的值。對於字典的更新或刪除操作總是影響的是列表中第一個字典。比如:

>>> 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'"

 

eg2:


ChainMap 對於編程語言中的作用范圍變量(比如globals , locals 等) 是非常有用的。事實上,有一些方法可以使它變得簡單:
>>> 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
>>> values
ChainMap({'x': 3}, {'x': 2}, {'x': 1})
>>> values['x']
3


 # Discard last mapping
>>> values = values.parents
>>> values['x']
2

 

eg3:

ChianMap 使用原來的字典,它自己不創建新的字典,比如:
>>> a = {'x': 1, 'z': 3 }
>>> b = {'y': 2, 'z': 4 }
>>> merged = ChainMap(a, b)
>>> merged['x']
1

>>> a['x'] = 42
>>> merged['x']
42


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM