collections.defaultdict – 容器数据类型(30)Python语言(必读进阶学习教程)(参考资料)
- class
collections.
defaultdict
([default_factory[, …]])
- 返回一个新的类似字典的对象。
defaultdict
是内置类的子dict
类。它覆盖了一种方法并添加了一个可写实例变量。其余功能与该类的相同,dict
此处未记录。第一个参数提供
default_factory
属性的初始值;它默认为None
. 所有剩余参数的处理方式与传递给dict
构造函数的参数相同,包括关键字参数。defaultdict
除了标准dict
操作之外,对象还支持以下方法:
key__missing__(
)
- 如果该
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})]