閱讀469 返回首頁    go Python


Python 字典操作進階

學習了 Python 基本的字典操作後,學習這些進階操作,讓寫出的代碼更加優雅簡潔和 pythonic 。

與字典值有關的計算問題

想對字典的值進行相關計算,例如找出字典裏對應值最大(最小)的項。

解決方案一:

假設要從字典 中找出值最小的項,可以這樣做:

值得注意的是 獲取字典的全部值, 獲取字典的全部鍵,而且兩個序列的順序依然保持一一對應的關係。因此 實質上生成的是一個 的序列。 函數通過比較序列中的元組 找出其最小值。

解決方案二:

除了使用 外,還可以使用 方法和生成器推導式來生成 序列,從而傳遞給 函數進行比較:

這裏 函數的參數 其實是一個生成器推導式(和列表推導式一樣,隻是把列表推導式的 改為 ,而且其返回的一個生成器而非列表),由於生成器推導式做為 函數的參數,所以可以省略掉兩邊的括號(不做為參數時寫法應該是 )。

字典推導式問題

想把一個元組列表轉換成一個字典,例如把 轉化為

解決方案

類似於列表推導式,字典推導式可以方便地從其他數據結構構造字典,例如:

字典推導式的規則和列表推導式一樣,隻是把 換成

尋找字典的交集問題

假設有兩個字典:

要找出這兩個字典中具有公共鍵的項,即要得到結果

解決方案

我們知道一般通過 方法來遍曆字典, 方法返回的對象是一個類集合對象,支持集合的基本運算,如取交集、並集等。

此外, 返回字典的鍵,也是一個類集合對象,如果我們隻想找出兩個字典中鍵相同的項,可以這樣:

這裏如果相同的鍵對應不同的值則去第一個字典中的值。推廣開來,如果想排除掉字典中的某些鍵,可以這樣:

但有一點需要注意的是, 返回字典的值,由於字典對應的值不一定唯一,所以 一般無法構成一個集合,因此也就不支持一般的集合操作。

多個字典連接成一個字典問題

有多個字典,例如:

想將這多個字典連接為一個字典,或一次性對多個字典進行迭代操作。

解決方案

使用 :

將傳入的多個字典連接為一個字典,並返回一個 對象,這個對象的行為就像一個單一的字典,我們可以對其進行取值或者迭代等操作。注意到這裏鍵 對應的值為 3,如果傳入 的字典含有相同的鍵,則對應的值為先傳入的字典中的值。

此外,如果你隻想單純地迭代字典的鍵值對,可以結合使用 和 方法:

這裏相同的鍵會被分別迭代出來。

保持字典有序問題

想讓字典中元素的迭代順序和其加入字典的順序保持一致

解決方案

通常來說,使用 或者 、 方法迭代出來的元素順序是無法預料的。例如對字典 迭代:

每一次運行結果都可能不同。如果想讓元素迭代的順序和創建字典時元素的順序一致,就要使用 代替普通的 :

實際通過維護一個雙向鏈表來記錄元素添加的順序,因此其耗費的內存大約為普通字典的兩倍。所以在實際使用中需綜合考慮各種因素來決定是否使用 。

使字典的鍵映射多個值問題

通常情況下字典的鍵隻對應一個值。現在想讓一個鍵對應多個值。

解決方案

為了使一個鍵對應多個值,首先需要把多個值放到一個容器中(例如列表或者集合等)。例如有這樣一個列表: ,我們要將其轉換成一個字典,保持元素的鍵值對應關係,通常我們會寫這樣的代碼:

但是 語句讓代碼顯得有點冗餘和不易讀, 的 改善上述代碼。

的判語句沒有了。

是 的一個子類。對 來說,如果 不存在,則 取值操作會拋出 異常,但是 則會返回一個傳入 構造器的類的實例(例如一個列表)或者自定義的缺失值。因此在上例中,對於 ,當 不存在時,則會先執行 並返回這個空列表,繼而將 加入到列表中。

傳入 構造器的值不一定要是一個類,也可以是一個可調用的函數,當相應的鍵不在 中時,其默認的值就為這個函數的返回值,例如:

利用這樣一個特性,我們可以構造無限深度的字典結構:

這裏當執行 時,由於相應的鍵不存在,故返回一個 ,當再執行 時,將鍵 對應的值設為 1 。

最後更新:2017-10-08 15:41:57

  上一篇:go Python查看微信好友男女比例
  下一篇:go Python進程、線程、回調與協程 總結筆記 適合新手明確基本概念