Python中的defaultdict可用于给所有的key赋一个默认的value
这样当访问的key对应的value不存在的时候,可以返回一个默认值
一些defaultdict的用法:
dd = defaultdict(list) def zero(): return 0 dd = defaultdict(zero) dd = defaultdict(lambda: 0)
defaultdict的实现使用了魔术方法:__missing__()
通过如下操作:
>>> from collections import defaultdict >>> print defaultdict.__missing__.__doc__ __missing__(key) # Called by __getitem__ for missing key; pseudo-code: if self.default_factory is None: raise KeyError((key,)) self[key] = value = self.default_factory() return value
可以看出当使用__getitem__来访问一个不存在的key的时候,会调用__miss__()方法获取默认值,并将该值添加到字典中去
从这里 https://docs.python.org/3/library/stdtypes.html#dict 可以得知,dict中不存在__missing__()方法,需要在派生的子类中自己实现这个方法
举个例子:
def Missing(dict): def __missing__(self, key): self[key] = 'default' # 若不加这一句,对Missing这个dict来说是有很大区别的 return 'default'
由于defaultdict类是从2.5版本之后才添加的,一个在2.5之前版本调用defaultdict的写法是这样的:
try: from collections import defaultdict except ImportError: class defaultdict(dict): def __init__(self, default_factory=None, *a, **kw): dict.__init__(self, *a, **kw) self.default_factory = default_factory def __getitem__(self, key): try: return dict.__getitem__(self, key) except KeyError: return self.__missing__(key) def __missing__(self, key): self[key] = value = self.default_factory() return value
总结自:http://kodango.com/understand-defaultdict-in-python