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

上一篇文章: Python實用技法第18篇:同時對數據作轉換和換算
下一篇文章: Python實用技法第20篇:針對任意多的分隔符拆分字符串

一、需求🙀

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

二、解決方案😸

假設有兩個字典:segmentfault

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

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

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

運行結果:對象

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

三、分析😈

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

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

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

del c['x'] #能夠正常刪除a中的'x':1
del c['y'] #會移除,由於第一個映射結構a中沒有y鍵

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

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

運行結果:date

4550769400
4549694808
1
2
3

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

上一篇文章: Python實用技法第18篇:同時對數據作轉換和換算
下一篇文章: Python實用技法第20篇:針對任意多的分隔符拆分字符串
相關文章
相關標籤/搜索