天天看點

《Python Cookbook(第3版)中文版》——1.20 将多個映射合并為單個映射

本節書摘來自異步社群《python cookbook(第3版)中文版》一書中的第1章,第1.20節,作者[美]david beazley , brian k.jones,陳舸 譯,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

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

假設有兩個字典:

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

chainmap可接受多個映射然後在邏輯上使它們表現為一個單獨的映射結構。但是,這些映射在字面上并不會合并在一起。相反,chainmap隻是簡單地維護一個記錄底層映射關系的清單,然後重定義常見的字典操作來掃描這個清單。大部分的操作都能正常工作。例如:

如果有重複的鍵,那麼這裡會采用第一個映射中所對應的值。是以,例子中的c[‘z’]總是引用字典a中的值,而不是字典b中的值。

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

chainmap與帶有作用域的值,比如程式設計語言中的變量(即全局變量、局部變量等)一起工作時特别有用。實際上這裡有一些方法使這個過程變得簡單:

作為chainmap的替代方案,我們可能會考慮利用字典的update()方法将多個字典合并在一起。例如:

這麼做行得通,但這需要單獨建構一個完整的字典對象(或者修改其中現有的一個字典,這就破壞了原始資料)。此外,如果其中任何一個原始字典做了修改,這個改變都不會反應到合并後的字典中。例如:

而chainmap使用的就是原始的字典,是以它不會産生這種令人不悅的行為。示例如下: