defaultdict 用于避免手動檢查鍵是否存在,自動為未初始化的鍵提供默認值。它在分組數據、統計計數和構建嵌套字典結構時非常有用。1. 在分組場景中,可直接對鍵進行追加操作,無需判斷鍵是否存在;2. 可替代計數器,通過 defaultdict(int) 自動初始化為0并累加;3. 支持構建多層嵌套字典結構,每層自動創建所需類型。使用時需注意,默認工廠函數必須是可調用對象,并非所有情況都適用,訪問不存在的鍵會自動創建可能影響性能或邏輯安全。
在 python 中,defaultdict 是 collections 模塊里一個非常實用的類,它繼承自內置的 dict 類。與普通字典不同的是,當你訪問一個不存在的鍵時,defaultdict 不會拋出 KeyError,而是自動創建一個默認值。這對于一些需要頻繁初始化字典值的場景特別有用。
為什么用 defaultdict?
使用普通字典時,如果你嘗試訪問一個不存在的鍵并試圖對其進行操作(比如追加元素),通常需要先判斷這個鍵是否存在:
這種寫法雖然可行,但代碼顯得有些冗余。而 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 能讓你在處理字典邏輯時少些判斷語句,代碼更簡潔清晰。