Python里collections.defaultdict 標準庫collections中defaultdict用法解析

defaultdict 用于避免手動檢查鍵是否存在,自動為未初始化的鍵提供默認值。它在分組數據、統計計數和構建嵌套字典結構時非常有用。1. 在分組場景中,可直接對鍵進行追加操作,無需判斷鍵是否存在;2. 可替代計數器,通過 defaultdict(int) 自動初始化為0并累加;3. 支持構建多層嵌套字典結構,每層自動創建所需類型。使用時需注意,默認工廠函數必須是可調用對象,并非所有情況都適用,訪問不存在的鍵會自動創建可能影響性能或邏輯安全。

python 中,defaultdict 是 collections 模塊里一個非常實用的類,它繼承自內置的 dict 類。與普通字典不同的是,當你訪問一個不存在的鍵時,defaultdict 不會拋出 KeyError,而是自動創建一個默認值。這對于一些需要頻繁初始化字典值的場景特別有用。

為什么用 defaultdict?

使用普通字典時,如果你嘗試訪問一個不存在的鍵并試圖對其進行操作(比如追加元素),通常需要先判斷這個鍵是否存在:

d = {} if 'key' not in d:     d['key'] = [] d['key'].append('value')

這種寫法雖然可行,但代碼顯得有些冗余。而 defaultdict 可以簡化這一過程:

from collections import defaultdict  d = defaultdict(list) d['key'].append('value')

這里我們告訴 defaultdict,當訪問不存在的鍵時,應該初始化一個空列表作為默認值,這樣就可以直接進行 .append() 操作。

立即學習Python免費學習筆記(深入)”;

defaultdict 的常見用途

1. 快速構建分組結構

這是 defaultdict 最常見的用途之一。例如,你有一組數據,想按照某個字段進行分類匯總:

data = [('a', 1), ('b', 2), ('a', 3), ('b', 4)] result = defaultdict(list)  for key, value in data:     result[key].append(value)

結果是:

{     'a': [1, 3],     'b': [2, 4] }
  • 這種方式避免了手動檢查鍵是否存在的麻煩。
  • 如果你用普通字典實現同樣的功能,就需要每次都用 setdefault() 或者 if 判斷。

2. 統計計數器(替代 Counter)

雖然 Counter 更適合做統計,但在某些情況下也可以用 defaultdict(int) 來實現類似功能:

words = ['apple', 'banana', 'apple', 'orange'] counts = defaultdict(int)  for word in words:     counts[word] += 1

結果是:

{     'apple': 2,     'banana': 1,     'orange': 1 }
  • defaultdict(int) 的意思是:遇到新鍵時,初始化為 0。
  • 和 Counter 相比,這種方式更靈活,可以嵌套使用或其他類型結合。

3. 構建多層嵌套字典結構

有時候我們需要構造一個多級字典,比如按年、月、日組織數據。這時候可以用嵌套的 defaultdict:

from collections import defaultdict  tree = defaultdict(Lambda: defaultdict(dict)) tree['2025']['April']['15'] = 'event'

上面這段代碼不會報錯,因為每一層都自動創建了下一層的結構。

  • 使用 lambda 表達式可以讓每層返回不同的默認類型。
  • 如果你想讓第二層也是 defaultdict,第三層才是普通字典或列表,都可以靈活組合。

注意事項和小技巧

  • 默認工廠函數必須是可調用對象:比如 list、int、或者你自己定義的函數,不能是像 0 或 ‘str’ 這樣的常量
  • 不是所有場景都適合 defaultdict
    • 如果你不希望字典在訪問不存在鍵時“偷偷”創建新鍵,那還是用普通字典更安全。
    • 在某些性能敏感的場景中,頻繁調用默認工廠函數可能帶來額外開銷。
  • defaultdict 不等于自動去重:很多人誤以為它能自動處理重復鍵的問題,其實它只是方便初始化而已。

基本上就這些。掌握 defaultdict 能讓你在處理字典邏輯時少些判斷語句,代碼更簡潔清晰。

以上就是Python里collections.defaultdict

? 版權聲明
THE END
喜歡就支持一下吧
點贊14 分享