Python:defaultdict应用示例

时间:2022-06-01 21:25:08
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})]