依然是collections模塊,提供了比基礎數據類型更為豐富,適合特定場景下的數據結構。當需要將某個鍵映射到一個集合類型(list,tuple)時,有時候需要初始化集合類型。故我們經常會碰到以下的代碼場景。
d = {}
for key, value in pairs:
if key not in d:
d[key] = []
d[key].append(value)
而使用defaultdict時,我們可以在初始化時預設數據類型和默認值。
d = defaultdict(list)
for key, value in pairs:
d[key].append(value)
defaultdict支持幾乎所有的dict熟悉和方法操作。額外,在初始化時,提供工廠屬性default_factory。默認為None,如果default_factory不是None,則不帶參數調用它以提供給定鍵的默認值,此值將插入鍵的字典中並返回。
defaultdict提供了一個__miss__方法,該方法只會被__getitem__()調用,即在進行d[key]獲取key對應的值時。_missing_()方法使用default_factory屬性; 它從構造函數的第一個參數(如果存在)初始化,如果不存在則初始化為None。
from collections import defaultdict
d = defaultdict(list)
d['a'].append(1)
d['a'].append(2)
d['a'].append(4)
>>> d
defaultdict(<class 'list'>, {'a': [1, 2, 4]})
嘗試編寫defaultdict的內部實現,如下:
class DefaultDict(dict):
def __init__(self, default_factory):
self.default_factory = default_factory
def __missing__(self, key):
if self.default_factory is None:
raise KeyError(key)
return self.default_factory()
def __getitem__(self, key):
if key not in self:
super().__setitem__(key, self.__missing__(key))
return super().__getitem__(key)