defaultdict使用示例


依然是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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM