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)