enumerate 函数最常用于遍历列表或元组,因为它能同时提供元素的索引和值,对于字典来说,情况稍微有些不同,因为字典的核心是键值对。

核心概念
enumerate() 函数是一个 Python 内置函数,它接受一个可迭代对象(如列表、元组、字符串、字典等)作为参数,并返回一个迭代器,这个迭代器会生成包含索引和值的元组。
对于字典,当直接使用 enumerate(dict) 时,它会遍历字典的 键。
my_dict = {'a': 1, 'b': 2, 'c': 3}
# 直接遍历字典,enumerate 会提供键和索引
for index, key in enumerate(my_dict):
print(f"索引: {index}, 键: {key}")
# 输出:
# 索引: 0, 键: a
# 索引: 1, 键: b
# 索引: 2, 键: c
在实际开发中,我们通常更关心的是 键 和 值,我们需要结合 dictionary.items() 方法来达到目的。
主要用法:enumerate(dict.items())
这是使用 enumerate 处理字典最常用、最强大的方式。dict.items() 方法会返回一个包含字典所有键值对的视图对象,每个键值对是一个 (key, value) 元组。enumerate 会为这些 (key, value) 元组加上索引。

示例 1:获取索引、键和值
这是最常见的需求,同时获取键、值以及它们在迭代中的顺序索引。
scores = {
'Alice': 95,
'Bob': 88,
'Charlie': 76,
'David': 99
}
print("使用 enumerate 遍历字典的键和值:")
for index, (name, score) in enumerate(scores.items()):
print(f"排名 {index + 1}: {name} 的分数是 {score}")
# 输出:
# 使用 enumerate 遍历字典的键和值:
# 排名 1: Alice 的分数是 95
# 排名 2: Bob 的分数是 88
# 排名 3: Charlie 的分数是 76
# 排名 4: David 的分数是 99
代码解析:
scores.items()返回[('Alice', 95), ('Bob', 88), ('Charlie', 76), ('David', 99)]这样的视图。enumerate(scores.items())返回[(0, ('Alice', 95)), (1, ('Bob', 88)), ...]这样的迭代器。- 在
for循环中,我们使用index, (name, score)进行 元组解包:index接收元组的第一个元素(索引)。(name, score)接收元组的第二个元素,它本身是一个(key, value)元组,所以我们再次解包它,分别赋值给name和score。
enumerate 的可选参数 start
enumerate 函数有一个可选参数 start,用于指定索引的起始值,默认为 0。
示例 2:从 1 开始排名
上面的例子中,我们通过 index + 1 来实现从 1 开始排名,更优雅的方式是直接使用 start 参数。

scores = {
'Alice': 95,
'Bob': 88,
'Charlie': 76,
'David': 99
}
print("使用 start=1 从 1 开始排名:")
for index, (name, score) in enumerate(scores.items(), start=1):
print(f"排名 {index}: {name} 的分数是 {score}")
# 输出:
# 使用 start=1 从 1 开始排名:
# 排名 1: Alice 的分数是 95
# 排名 2: Bob 的分数是 88
# 排名 3: Charlie 的分数是 76
# 排名 4: David 的分数是 99
这个方法更清晰、更直接,是处理排名、序号等场景的最佳实践。
其他用法:只遍历键或只遍历值
虽然不常用,但了解 enumerate 与 dict.keys() 和 dict.values() 的交互也是有帮助的。
示例 3:只遍历键(并获取索引)
my_dict = {'a': 1, 'b': 2, 'c': 3}
print("只遍历键(带索引):")
for index, key in enumerate(my_dict.keys()):
print(f"索引: {index}, 键: {key}")
# 输出:
# 只遍历键(带索引):
# 索引: 0, 键: a
# 索引: 1, 键: b
# 索引: 2, 键: c
注意:for key in my_dict 和 for key in my_dict.keys() 的效果是相同的,后者更明确一些。
示例 4:只遍历值(并获取索引)
my_dict = {'a': 1, 'b': 2, 'c': 3}
print("只遍历值(带索引):")
for index, value in enumerate(my_dict.values()):
print(f"索引: {index}, 值: {value}")
# 输出:
# 只遍历值(带索引):
# 索引: 0, 值: 1
# 索引: 1, 值: 2
# 索引: 2, 值: 3
总结与最佳实践
| 遍历方式 | 代码示例 | 应用场景 |
|---|---|---|
| 遍历键 | for key in my_dict: |
最常用,当你只需要键时。 |
| 遍历键和值 | for key, value in my_dict.items(): |
最常用,当你需要同时处理键和值时。 |
| 遍历键和值(带索引) | for index, (key, value) in enumerate(my_dict.items()): |
最佳实践,当你需要知道元素在迭代中的顺序(如排名、序号、生成报告)时。 |
| 遍历键和值(从1开始索引) | for index, (key, value) in enumerate(my_dict.items(), start=1): |
最佳实践,当你需要从1开始计数时(如排名、列表序号)。 |
核心要点:
enumerate(dict)会遍历字典的 键。- 要同时获取 索引、键、值,必须使用
enumerate(dict.items())。 - 使用元组解包
index, (key, value)来清晰地将enumerate返回的结构赋值给变量。 - 利用
start参数可以轻松改变索引的起始值,使代码更具可读性。
