这是一个非常常用且强大的内置函数,它的主要作用是在遍历可迭代对象(如列表、元组、字符串等)时,同时获取元素的索引和值。

enumerate 是什么?
enumerate 就像一个“编号器”,当你遍历一个列表时,它不仅能给你列表里的每一个元素,还能告诉你这个元素是第几个(从0开始计数)。
官方定义:
enumerate(iterable, start=0) 返回一个枚举对象,该对象生成由 count(从 start 开始)和来自 iterable 的值组成的元组。
核心输出:一个迭代器,每次迭代都会产生一个 (index, value) 形式的元组。
为什么需要 enumerate?(解决了什么问题)
在没有 enumerate 之前,如果我们想在循环中同时得到索引和值,通常需要这样做:

# 传统方法:使用 range(len())
fruits = ['apple', 'banana', 'cherry']
for i in range(len(fruits)):
fruit = fruits[i]
print(f"索引: {i}, 值: {fruit}")
输出:
索引: 0, 值: apple
索引: 1, 值: banana
索引: 2, 值: cherry
这种方法虽然可行,但代码略显笨拙:
len(fruits)是多余的,我们其实不需要先计算长度。- 通过
fruits[i]来访问元素,多了一步索引查找,不够直接和“Pythonic”。
使用 enumerate 可以让代码更简洁、更易读、更符合 Python 的风格。
enumerate 的基本用法
语法
enumerate(iterable, start=0)

iterable: 任何可迭代对象(列表、元组、字符串、字典等)。start: 可选参数,指定索引的起始值,默认为0。
示例 1:遍历列表(默认从 0 开始)
fruits = ['apple', 'banana', 'cherry']
# 直接遍历 enumerate 对象
for index, value in enumerate(fruits):
print(f"索引: {index}, 值: {value}")
输出:
索引: 0, 值: apple
索引: 1, 值: banana
索引: 2, 值: cherry
代码解析:
enumerate(fruits)创建了一个枚举对象。- 在
for循环中,我们使用for index, value in ...的形式进行元组解包,每次迭代,enumerate返回的(0, 'apple')这样的元组会自动解包成index = 0和value = 'apple'。
示例 2:指定起始索引
假设我们想让索引从 1 开始计数(就像列表的第1项、第2项...)。
fruits = ['apple', 'banana', 'cherry']
for index, value in enumerate(fruits, start=1):
print(f"序号: {index}, 值: {value}")
输出:
序号: 1, 值: apple
序号: 2, 值: banana
序号: 3, 值: cherry
代码解析:
- 我们只需要在
enumerate中传入start=1即可,非常方便。
enumerate 的高级用法
示例 3:与其他可迭代对象一起使用
enumerate 不仅限于列表,它可以用于任何可迭代对象。
用于元组:
# 计算字符串中每个字符的ASCII码
text = "hello"
for index, char in enumerate(text):
print(f"字符 '{char}' 的ASCII码是 {ord(char)}")
用于字符串:
# 遍历元组
coordinates = (10.0, 20.0, 30.0)
for i, coord in enumerate(coordinates):
print(f"坐标 {i+1}: {coord}")
示例 4:直接转换为列表或字典
你可以将 enumerate 的结果直接转换为其他数据结构,这在数据处理中非常有用。
转换为列表:
fruits = ['apple', 'banana', 'cherry'] list_of_tuples = list(enumerate(fruits)) print(list_of_tuples)
输出:
[(0, 'apple'), (1, 'banana'), (2, 'cherry')]
转换为字典(一个经典技巧):
假设有两个列表,一个作为键,一个作为值,我们可以用 enumerate 和 zip 来快速创建字典。
keys = ['name', 'age', 'city']
values = ['Alice', 30, 'New York']
# 使用 zip 和 enumerate
# zip(keys, values) 会生成 [('name', 'Alice'), ('age', 30), ('city', 'New York')]
# 然后我们只需要值,所以用解包忽略索引
my_dict = {key: value for key, value in zip(keys, values)}
print(my_dict)
# 更直接的方式(如果索引不重要)
my_dict_v2 = dict(zip(keys, values))
print(my_dict_v2)
输出:
{'name': 'Alice', 'age': 30, 'city': 'New York'}
{'name': 'Alice', 'age': 30, 'city': 'New York'}
(注:虽然这里没有直接使用 enumerate,但展示了 enumerate 所在的“迭代器工具”生态,如果需要一个带索引的字典,可以这样:)
keys = ['name', 'age', 'city']
my_dict_with_index = {index: key for index, key in enumerate(keys)}
print(my_dict_with_index)
输出:
{0: 'name', 1: 'age', 2: 'city'}
示例 5:在列表推导式中使用
你可以在列表推导式中使用 enumerate 来创建基于索引的新列表。
words = ['hello', 'world', 'python'] # 创建一个新列表,包含每个单词的长度和其索引 word_info = [(i, len(word)) for i, word in enumerate(words)] print(word_info)
输出:
[(0, 5), (1, 5), (2, 6)]
enumerate vs. zip
enumerate 和 zip 是两个经常被放在一起讨论的函数,因为它们都用于处理多个序列。
| 特性 | enumerate(iterable) |
zip(iterable1, iterable2, ...) |
|---|---|---|
| 目的 | 为一个可迭代对象的元素添加索引。 | 将多个可迭代对象的元素按索引配对。 |
| 输入 | 1 个可迭代对象。 | 2 个或多个可迭代对象。 |
| 输出 | (index, element_from_iterable1) |
(element_from_iterable1, element_from_iterable2, ...) |
| 类比 | 给一排人编号(编号, 姓名)。 | 把两个班级的第一名放一起,第二名放一起...(班级1_学生, 班级2_学生)。 |
zip 示例:
names = ['Alice', 'Bob', 'Charlie']
scores = [85, 92, 78]
# 将名字和分数配对
for name, score in zip(names, scores):
print(f"{name} 的分数是 {score}")
输出:
Alice 的分数是 85
Bob 的分数是 92
Charlie 的分数是 78
enumerate 是 Python 中一个不可或缺的工具函数,当你需要在循环中同时获取元素的索引和值时,它应该成为你的首选。
核心优势:
- 代码简洁:避免了
range(len(...))的冗余写法。 - 可读性强:
for index, value in enumerate(...)的意图非常清晰。 - 功能灵活:可以通过
start参数轻松控制索引的起始值。
记住它,并在你的日常编码中多使用它,你的代码会变得更“Pythonic”!
