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})]