Python實用技法第19篇:將多個映射合併爲單個映射

1、需求

我們有多個字典或映射,想在邏輯上將它們合併爲一個單獨的映射結構,以此執行一些特定的操作,比如查找值或檢查鍵是否存在。

2、解決方案

假設有兩個字典:

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

現在假設想執行查找操作,我們必須檢查這兩個字典(例如,先在a中查找,如果沒做找到在去b中查找)。一種簡單的方法是利用collections模塊中的ChainMap類來解決這個問題。例如:

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'])
Python資源分享qun 784758214 ,內有安裝包,PDF,學習視頻,這裏是Python學習者的聚集地,零基礎,進階,都歡迎

運行結果:

1
2
3
3
['y', 'z', 'x']
[2, 3, 1]
5

3、分析
ChainMap可接受多個映射然後在邏輯上事它們表現爲一個單獨的映射機構。但是,這些映射運行時並不會合併在一起。相反,ChainMap只是簡單地維護一個記錄底層映射關係的列表,然後重定義常見的字典操作來掃描這個列表。大部分的列表操作都能正常工作。例如:len、keys()、values()。

如果有重複的鍵,那麼會採用第一個映射中所對應的值。

修改映射的操作總是會作用在列出的第一個映射結構上。例如:

del c['x'] #可以正常刪除a中的'x':1
del c['y'] #會移除,因爲第一個映射結構a中沒有y鍵

作爲ChainMap的替代方案,我們可能會考慮利用字典的update()方法將多個字典合併在一起,例如:

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'])

運行結果:

4550769400
4549694808
1
2
3
Python資源分享qun 784758214 ,內有安裝包,PDF,學習視頻,這裏是Python學習者的聚集地,零基礎,進階,都歡迎

這麼做行得通,但是這需要單獨構建一個完整的字典對象(或者直接修改其中一個,但會破壞原始數據)。此外,如果其中任何一個原始字典做了修改,這個改變都不會反應到合併後的字典中,但是ChainMap就可以。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章