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
