简介
Python 的 defaultdict 是一种强大的数据结构,它简化了处理缺失键的过程。在本教程中,我们将深入探讨在 defaultdict 中迭代键的技巧,让你掌握在 Python 项目中充分发挥其潜力所需的知识。
defaultdict 简介
在 Python 中,defaultdict 是内置 dict 类的一个子类。它提供了一种创建类似字典对象的方式,该对象对于缺失的键具有默认值。当你需要对字典执行操作,且在访问不存在的键时不想担心处理 KeyError 异常时,这会特别有用。
defaultdict 在 collections 模块中定义,它接受一个可调用对象作为参数。这个可调用对象用于为任何新访问的键提供默认值。
以下是创建一个 defaultdict 的示例:
from collections import defaultdict
## 创建一个默认值为 0 的 defaultdict
d = defaultdict(int)
## 向字典中添加一些值
d['apple'] = 2
d['banana'] = 3
## 访问一个不存在的键
print(d['orange']) ## 输出: 0
在上述示例中,当我们尝试访问字典中不存在的键 'orange' 时,defaultdict 会自动创建一个新条目,其默认值为 0。
defaultdict 可以与各种可调用对象一起使用,例如 list、set,甚至是自定义函数,以便为缺失的键提供不同的默认值。
graph TD
A[创建一个 defaultdict] --> B[指定一个默认值]
B --> C[向字典中添加值]
C --> D[访问不存在的键]
D --> E[自动提供默认值]
通过使用 defaultdict,你可以简化代码,并且无需在访问键之前检查键是否存在。这可以使你的代码更简洁、更易读。
在 defaultdict 中迭代键
在 defaultdict 中迭代键与在常规字典中迭代键类似。你可以使用相同的方法和技巧来访问键。
以下是几种在 defaultdict 中迭代键的方法:
使用 keys() 方法
from collections import defaultdict
## 创建一个默认值为 0 的 defaultdict
d = defaultdict(int)
d['apple'] = 2
d['banana'] = 3
d['orange'] = 1
## 使用 keys() 方法迭代键
for key in d.keys():
print(key)
输出:
apple
banana
orange
使用 for 循环
from collections import defaultdict
## 创建一个默认值为 0 的 defaultdict
d = defaultdict(int)
d['apple'] = 2
d['banana'] = 3
d['orange'] = 1
## 使用 for 循环迭代键
for key in d:
print(key)
输出:
apple
banana
orange
使用 items() 方法
from collections import defaultdict
## 创建一个默认值为 0 的 defaultdict
d = defaultdict(int)
d['apple'] = 2
d['banana'] = 3
d['orange'] = 1
## 使用 items() 方法迭代键和值
for key, value in d.items():
print(key)
输出:
apple
banana
orange
如你所见,在 defaultdict 中迭代键与在常规字典中迭代键没有区别。defaultdict 的行为与常规字典一样,只是额外提供了为缺失键设置默认值的功能。
defaultdict 的实际应用场景
defaultdict 是一种通用的数据结构,可用于各种场景。以下是 defaultdict 的一些实际应用场景:
统计出现次数
defaultdict 的一个常见应用场景是统计列表或序列中元素的出现次数。通过使用默认值为 0 的 defaultdict,你可以轻松跟踪每个元素的计数。
from collections import defaultdict
## 统计句子中单词的出现次数
sentence = "the quick brown fox jumps over the lazy dog"
word_count = defaultdict(int)
for word in sentence.split():
word_count[word] += 1
print(dict(word_count))
输出:
{'the': 2, 'quick': 1, 'brown': 1, 'fox': 1, 'jumps': 1, 'over': 1, 'lazy': 1, 'dog': 1}
数据分组
defaultdict 的另一个常见应用场景是根据键对数据进行分组。通过使用默认值为空列表或集合的 defaultdict,你可以轻松地将值追加到相应的列表或集合中。
from collections import defaultdict
## 按成绩对学生进行分组
students = [
{"name": "Alice", "grade": "A"},
{"name": "Bob", "grade": "B"},
{"name": "Charlie", "grade": "A"},
{"name": "David", "grade": "C"},
{"name": "Eve", "grade": "B"}
]
grade_groups = defaultdict(list)
for student in students:
grade_groups[student["grade"]].append(student["name"])
print(dict(grade_groups))
输出:
{'A': ['Alice', 'Charlie'], 'B': ['Bob', 'Eve'], 'C': ['David']}
构建树状和嵌套结构
defaultdict 还可用于构建树状数据结构或嵌套字典。通过使用默认值为另一个 defaultdict 的 defaultdict,你可以创建一个层次结构数据结构,该结构易于遍历和操作。
from collections import defaultdict
## 构建一个嵌套字典
data = defaultdict(lambda: defaultdict(int))
data["fruits"]["apples"] = 5
data["fruits"]["bananas"] = 3
data["vegetables"]["carrots"] = 10
data["vegetables"]["broccoli"] = 7
print(dict(data))
输出:
{'fruits': {'apples': 5, 'bananas': 3},'vegetables': {'carrots': 10, 'broccoli': 7}}
这些只是 Python 中 defaultdict 实际应用场景的几个示例。通过利用其为缺失键提供默认值的能力,你可以编写更简洁、更健壮的代码,更优雅地处理边界情况。
总结
在本教程结束时,你将扎实地理解如何在 Python 中有效地迭代 defaultdict 中的键。你还将发现这个通用数据结构的实际应用场景,使你能够优化代码并提升解决问题的能力。拥抱 defaultdict 的强大功能,将你的 Python 编程提升到新的高度。



