collections

defaultdict

Python 的 defaultdictcollections 模块中的一个非常有用的容器,它是对内置字典(dict)的一种增强,用于在访问不存在的键时自动创建默认值,避免抛出 KeyError

基本语法

from collections import defaultdict

d = defaultdict(default_factory)
  • default_factory 是一个可调用对象(通常是类型,如 intlistset 等),当访问不存在的键时,defaultdict 会自动调用它来生成该键的默认值。

使用示例

使用 list 作为默认工厂

from collections import defaultdict

d = defaultdict(list)
d['a'].append(1)
d['a'].append(2)
d['b'].append(3)

print(d) # 输出: defaultdict(<class 'list'>, {'a': [1, 2], 'b': [3]})

这相当于:

d = {}
if 'a' not in d:
d['a'] = []
d['a'].append(1)

使用 int 作为默认工厂(默认值为 0)

from collections import defaultdict

d = defaultdict(int)
d['apple'] += 1
d['banana'] += 2

print(d) # 输出: defaultdict(<class 'int'>, {'apple': 1, 'banana': 2})

这是统计频率非常常用的方式。

使用 lambda 自定义默认值

from collections import defaultdict

d = defaultdict(lambda: 'unknown')
print(d['name']) # 输出: unknown

与普通字典的区别

特性 dict defaultdict
访问不存在的键 抛出 KeyError 自动创建并返回默认值
用于计数、分组等情况 需要手动判断键是否存在 自动处理更简洁

注意事项

  • 如果访问一个不存在的键,default_factory 会被调用一次并生成该键的值。
  • 如果你不希望字典“自动”增长,请用普通 dict,因为 defaultdict 会改变字典的大小。

Counter

Counter 是 Python 标准库 collections 中的一个非常实用的类,专门用于计数对象中元素的出现次数。它本质上是 dict 的一个子类,但做了专门的优化,适用于频率统计、直方图计算等任务。

基本语法

from collections import Counter

c