上一篇文章: 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篇:針對任意多的分隔符拆分字符串