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)
posted @ 2019-07-31 17:24  Jeffrey_Yang  阅读(3940)  评论(0编辑  收藏  举报