defaultdict
是 Python 标准库 collections
模块中的一个有用的子类,它提供了为字典中的键提供默认值的功能。如果尝试访问字典中不存在的键时,defaultdict
可以自动为该键创建一个初始值,而不引发 KeyError
异常。
使用示例
from collections import defaultdict
# 定义一个defaultdict,其中int表示默认值为0的整数
default_dict = defaultdict(int)
# 访问不存在的键时,defaultdict会自动创建该键,并将其值设置为默认值0
print(default_dict['a']) # 输出: 0
# 可以像普通字典一样进行赋值操作
default_dict['a'] += 1
print(default_dict['a']) # 输出: 1
# 另一个例子:使用list作为默认值
list_default_dict = defaultdict(list)
# 访问不存在的键时,defaultdict会自动创建该键,并将其值设置为空列表
list_default_dict['a'].append(1)
print(list_default_dict['a']) # 输出: [1]
常见用法
1. 计数
使用 defaultdict
来简化计数任务。
from collections import defaultdict
text = "hello world"
count = defaultdict(int)
for char in text:
count[char] += 1
print(count) # 输出: defaultdict(<class 'int'>, {'h': 1, 'e': 1, 'l': 3, 'o': 2, ' ': 1, 'w': 1, 'r': 1, 'd': 1})
2. 聚合
使用 defaultdict
来聚合数据,例如将相同键的值收集到一个列表中。
from collections import defaultdict
data = [('a', 1), ('b', 2), ('a', 3), ('b', 4)]
aggregation = defaultdict(list)
for key, value in data:
aggregation[key].append(value)
print(aggregation) # 输出: defaultdict(<class 'list'>, {'a': [1, 3], 'b': [2, 4]})
自定义默认值
可以使用任何可调用对象(如函数或类)来生成默认值。
from collections import defaultdict
# 定义一个函数作为默认值
def default_value():
return 'default'
custom_default_dict = defaultdict(default_value)
print(custom_default_dict['a']) # 输出: 'default'
其他示例
1. 使用 set
作为默认值
from collections import defaultdict
set_default_dict = defaultdict(set)
set_default_dict['a'].add(1)
set_default_dict['a'].add(2)
set_default_dict['b'].add(3)
print(set_default_dict) # 输出: defaultdict(<class 'set'>, {'a': {1, 2}, 'b': {3}})
2. 使用自定义类作为默认值
from collections import defaultdict
class Counter:
def __init__(self):
self.count = 0
def increment(self):
self.count += 1
custom_class_default_dict = defaultdict(Counter)
custom_class_default_dict['a'].increment()
custom_class_default_dict['a'].increment()
custom_class_default_dict['b'].increment()
print(custom_class_default_dict['a'].count) # 输出: 2
print(custom_class_default_dict['b'].count) # 输出: 1
总结
defaultdict
提供了一种简洁而有效的方法来处理字典中不存在的键,从而避免了手动初始化键值的繁琐工作。它非常适合用于计数、聚合和其他需要默认值的场景。