defaultdict
是 Python 标准库中 collections
模块提供的一个非常实用的字典子类。与普通字典不同,defaultdict
在你访问一个不存在的键时,会自动为这个键生成一个默认值。这种特性使得处理默认值变得更加简单,尤其是在需要构建复杂数据结构时。
defaultdict 的基本用法
首先,我们可以通过简单的示例来了解 defaultdict
的基本用法。假设我们想要统计每个字母在一段文本中出现的次数,使用普通字典实现可能需要初始化每个键的值,而使用 defaultdict
就可以省去这一步。
from collections import defaultdict
text = "hello world"
letter_count = defaultdict(int)
for letter in text:
letter_count[letter] += 1
print(letter_count)
在这个例子中,我们使用 defaultdict(int)
来创建一个字典,其默认值类型为整数(0)。当我们访问一个不存在的键时,defaultdict
会自动将其初始化为 0。最后的输出结果是每个字母出现的次数。
处理复杂数据结构
defaultdict
在处理复杂数据结构时非常方便。例如,假设我们有一组学生的成绩记录,我们想要按学生姓名分类记录他们的成绩。可以使用 defaultdict
来自动初始化一个列表:
from collections import defaultdict
grades = [('Alice', 85), ('Bob', 90), ('Alice', 95), ('Bob', 88), ('Charlie', 100)]
student_grades = defaultdict(list)
for name, grade in grades:
student_grades[name].append(grade)
print(student_grades)
在这个程序中,我们使用 defaultdict(list)
来创建一个字典,其默认值为一个空列表。当向字典中添加成绩时,defaultdict
确保每个学生的成绩列表得以自动创建。输出结果将显示每位学生的所有成绩。
嵌套 defaultdict
defaultdict
还有一个比较高级的使用场景,那就是创建嵌套的字典结构。例如,假设我们记录的是学生在不同科目中的成绩,可以这样做:
from collections import defaultdict
subject_grades = defaultdict(lambda: defaultdict(list))
records = [
('Alice', 'Math', 90),
('Alice', 'Science', 85),
('Bob', 'Math', 75),
('Bob', 'Science', 82),
]
for name, subject, score in records:
subject_grades[name][subject].append(score)
print(subject_grades)
在这个示例中,subject_grades
是一个嵌套的 defaultdict
。外层的 defaultdict
使用 lambda 函数来创建另一个 defaultdict(list)
,以便为每个学生初始化一个字典,字典的值是对应科目的成绩列表。
总结
defaultdict
是一个非常强大的工具,可以使我们的代码更加简洁和易于维护。通过使用 defaultdict
,我们可以不必担心每次访问字典时是否需要初始化键的值,特别是在处理嵌套数据结构时,defaultdict
可以极大地简化代码的复杂度。无论是用于计数、分组还是构建复杂的数据结构,defaultdict
都是开发者应该掌握的一个重要工具。