class collections.defaultdict([default_factory[]])
返回一个新的类似字典的对象。 defaultdict是内置类的子dict类。它覆盖了一种方法并添加了一个可写实例变量。其余功能与该类的相同, dict此处未记录。

第一个参数提供default_factory 属性的初始值;它默认为None. 所有剩余参数的处理方式与传递给dict构造函数的参数相同,包括关键字参数。

defaultdict除了标准dict操作之外,对象还支持以下方法:

__missing__(key)
如果该default_factory属性是None,这会引发一个 以作为参数的KeyError异常。

如果default_factory不是None,则不带参数调用它以提供给定的默认值,该值插入到的字典中,并返回。

如果调用default_factory引发异常,则此异常将不加改变地传播。

当找不到请求的键时,该__getitem__()方法由 类的方法调用;dict无论它返回或筹集什么,然后由返回或筹集__getitem__()

请注意,除了 . 之外的任何操作 __missing__()不会__getitem__()调用. 这意味着get()它将像普通词典一样返回None默认值而不是使用 default_factory.

defaultdict对象支持以下实例变量:

default_factory
该属性由__missing__()方法使用;它从构造函数的第一个参数(如果存在)或到 None(如果不存在)初始化。

defaultdict Examples

使用 list 作为 default_factory,很容易将一系列键值对分组到列表字典中:

>>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
>>> d = defaultdict(list)
>>> for k, v in s:
...    d[k].append(v)
...
>>> sorted(d.items())
[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]

当第一次遇到每个键时,它还不在映射中;default_factory 因此使用返回空的函数自动创建一个条目list。然后该list.append() 操作将值附加到新列表。当再次遇到键时,查找将正常进行(返回该键的列表)并且该 list.append()操作将另一个值添加到列表中。与使用以下方法的等效技术相比,此技术更简单、更快速dict.setdefault()

>>> d = {}
>>> for k, v in s:
...     d.setdefault(k, []).append(v)
...
>>> sorted(d.items())
[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]

将 default_factory 设置为 int 使得 defaultdict 对计数很有用(就像其他语言中的 bag 或 multiset):

>>> s = 'mississippi'
>>> d = defaultdict(int)
>>> for k in s:
...     d[k] += 1
... 
>>> sorted(d.items())
[('i', 4), ('m', 1), ('p', 2), ('s', 4)]

当第一次遇到一个字母时,映射中缺少它,因此 default_factory函数调用int()以提供默认计数零。递增操作然后建立每个字母的计数。

始终返回零的函数int()只是常量函数的特例。创建常量函数的一种更快、更灵活的方法是使用 lambda 函数,它可以提供任何常量值(不仅仅是零):

>>> def constant_factory(value):
...     return lambda: value
>>> d = defaultdict(constant_factory('<missing>'))
>>> d.update(name='John', action='ran')
>>> '%(name)s %(action)s to %(object)s' % d
'John ran to <missing>'

将 default_factory 设置为 set 使得 defaultdict 对于构建集合字典很有用:

>>> s = [('red', 1), ('blue', 2), ('red', 3), ('blue', 4), ('red', 1), ('blue', 4)]
>>> d = defaultdict(set)
>>> for k, v in s:
...     d[k].add(v)
... 
>>> sorted(d.items())
[('blue', {2, 4}), ('red', {1, 3})]