class collections.defaultdict([default_factory[, ...]])
defaultdict继承与内置类dict,但对于不存在的键处理方式不同。
dict处理缺失的键
在Python访问dict不存在的键会抛出KeyError异常。如计数列表里的颜色
colors = ('yellow', 'red', 'yellow', 'blue','black', 'white', 'blue', 'blue')
counts = {}
for k in colors:
counts[k] += 1
因为所有的键在字典counts里都不存在,在counts[k]+=1处会抛出KeyError异常。
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
KeyError: 'yellow'
我们可以使用dict的setdefault方法对不存在的键设置默认值以避免此问题。
colors = ('yellow', 'red', 'yellow', 'blue','black', 'white', 'blue', 'blue')
counts = {}
for k in colors:
counts.setdefault(k, 0)
counts[k] += 1
defaultdict处理缺失的键
defaultdict接受default_factory作为参数,defaultdict用它来初始化缺失键的默认值。
default_factory的值:
- default_factory可以是类型名,使用指定的类型初始化默认值。
- default_factory也可以是一个无参的lambda回调函数,回调函数的返回值作为缺失键的默认值。
需要注意的是,只有调用defaultdict的内置方法__getitem__()(实际就是使用下标访问字典,如d[k])才会使用default_factory初始化缺失键的默认值。
上面的示例修改如下:
from collections import defaultdict
colors = ('yellow', 'red', 'yellow', 'blue','black', 'white', 'blue', 'blue')
counts = defaultdict(int)
for k in colors:
counts[k] += 1
应用示例
分组键值对序列
设置default_factory为list:
>>> 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])]
计数
设置defaul_facotry为int:
>>> 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为set:
>>> 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})]