469
Python
Python 字典操作進階
學習了 Python 基本的字典操作後,學習這些進階操作,讓寫出的代碼更加優雅簡潔和 pythonic 。
與字典值有關的計算問題
想對字典的值進行相關計算,例如找出字典裏對應值最大(最小)的項。
解決方案一:
假設要從字典 中找出值最小的項,可以這樣做:
值得注意的是 獲取字典的全部值, 獲取字典的全部鍵,而且兩個序列的順序依然保持一一對應的關係。因此 實質上生成的是一個 的序列。 函數通過比較序列中的元組 找出其最小值。
解決方案二:
除了使用 外,還可以使用 方法和生成器推導式來生成 序列,從而傳遞給 函數進行比較:
這裏 函數的參數 其實是一個生成器推導式(和列表推導式一樣,隻是把列表推導式的 改為 ,而且其返回的一個生成器而非列表),由於生成器推導式做為 函數的參數,所以可以省略掉兩邊的括號(不做為參數時寫法應該是 )。
字典推導式問題
想把一個元組列表轉換成一個字典,例如把 轉化為
解決方案
類似於列表推導式,字典推導式可以方便地從其他數據結構構造字典,例如:
字典推導式的規則和列表推導式一樣,隻是把 換成
尋找字典的交集問題
假設有兩個字典:
要找出這兩個字典中具有公共鍵的項,即要得到結果
解決方案
我們知道一般通過 方法來遍曆字典, 方法返回的對象是一個類集合對象,支持集合的基本運算,如取交集、並集等。
此外, 返回字典的鍵,也是一個類集合對象,如果我們隻想找出兩個字典中鍵相同的項,可以這樣:
這裏如果相同的鍵對應不同的值則去第一個字典中的值。推廣開來,如果想排除掉字典中的某些鍵,可以這樣:
但有一點需要注意的是, 返回字典的值,由於字典對應的值不一定唯一,所以 一般無法構成一個集合,因此也就不支持一般的集合操作。
多個字典連接成一個字典問題
有多個字典,例如:
想將這多個字典連接為一個字典,或一次性對多個字典進行迭代操作。
解決方案
使用 :
將傳入的多個字典連接為一個字典,並返回一個 對象,這個對象的行為就像一個單一的字典,我們可以對其進行取值或者迭代等操作。注意到這裏鍵 對應的值為 3,如果傳入 的字典含有相同的鍵,則對應的值為先傳入的字典中的值。
此外,如果你隻想單純地迭代字典的鍵值對,可以結合使用 和 方法:
這裏相同的鍵會被分別迭代出來。
保持字典有序問題
想讓字典中元素的迭代順序和其加入字典的順序保持一致
解決方案
通常來說,使用 或者 、 方法迭代出來的元素順序是無法預料的。例如對字典 迭代:
每一次運行結果都可能不同。如果想讓元素迭代的順序和創建字典時元素的順序一致,就要使用 代替普通的 :
實際通過維護一個雙向鏈表來記錄元素添加的順序,因此其耗費的內存大約為普通字典的兩倍。所以在實際使用中需綜合考慮各種因素來決定是否使用 。
使字典的鍵映射多個值問題
通常情況下字典的鍵隻對應一個值。現在想讓一個鍵對應多個值。
解決方案
為了使一個鍵對應多個值,首先需要把多個值放到一個容器中(例如列表或者集合等)。例如有這樣一個列表: ,我們要將其轉換成一個字典,保持元素的鍵值對應關係,通常我們會寫這樣的代碼:
但是 語句讓代碼顯得有點冗餘和不易讀, 的 改善上述代碼。
的判語句沒有了。
是 的一個子類。對 來說,如果 不存在,則 取值操作會拋出 異常,但是 則會返回一個傳入 構造器的類的實例(例如一個列表)或者自定義的缺失值。因此在上例中,對於 ,當 不存在時,則會先執行 並返回這個空列表,繼而將 加入到列表中。
傳入 構造器的值不一定要是一個類,也可以是一個可調用的函數,當相應的鍵不在 中時,其默認的值就為這個函數的返回值,例如:
利用這樣一個特性,我們可以構造無限深度的字典結構:
這裏當執行 時,由於相應的鍵不存在,故返回一個 ,當再執行 時,將鍵 對應的值設為 1 。
最後更新:2017-10-08 15:41:57