Python enumerate 函数
上次修改时间:2025 年 4 月 11 日
本篇完整指南将探索 Python 的 enumerate 函数,它为可迭代对象添加一个计数器。我们将介绍基本用法、实际示例和高级技巧,以便使用索引进行高效迭代。
基本定义
enumerate 函数返回一个枚举对象,该对象生成一系列元组。每个元组包含一个索引和可迭代对象中的相应值。
主要特性:适用于任何可迭代对象,接受可选的 start 参数,内存高效(惰性求值),并在 Python 3 中返回一个迭代器。
带有索引的基本迭代
这是一个简单的用法示例,展示了 enumerate 如何在迭代期间同时提供索引和值。 这消除了手动管理计数器。
fruits = ['apple', 'banana', 'cherry']
# Without enumerate
for i in range(len(fruits)):
print(f"Index {i}: {fruits[i]}")
# With enumerate (cleaner)
for i, fruit in enumerate(fruits):
print(f"Index {i}: {fruit}")
第一个循环使用传统的基于索引的迭代。第二个循环演示了 enumerate 更简洁的方法,直接解包索引-值对。
通过消除手动索引处理和差一错误,enumerate 使代码更具可读性且不易出错。
自定义起始索引
enumerate 接受一个可选的 start 参数,以便从特定数字开始计数。这对于非零基数的索引很有用。
days = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri']
# Start counting from 1
for day_num, day_name in enumerate(days, start=1):
print(f"Day {day_num}: {day_name}")
# Output:
# Day 1: Mon
# Day 2: Tue
# Day 3: Wed
# ...
此示例展示了如何创建从 1 而不是 0 开始的方便用户阅读的编号。start 参数适用于任何整数值。
当向可能期望编号从 1 而不是 0 开始的用户显示索引时,此功能特别有用。
枚举字典
虽然字典是可迭代的,但与序列相比,enumerate 对它们的处理方式有所不同。此示例演示了这种行为。
person = {'name': 'John', 'age': 30, 'city': 'New York'}
# Enumerate over keys by default
for i, key in enumerate(person):
print(f"Index {i}: Key={key}, Value={person[key]}")
# Enumerate over items
for i, (key, value) in enumerate(person.items()):
print(f"Index {i}: {key}={value}")
第一个循环枚举字典键。第二个循环演示了如何使用 items() 枚举键值对以获得更完整的信息。
请记住,在 Python 3.7 之前,字典迭代顺序是任意的,但现在保持插入顺序。
使用行号处理文件
在处理文件以跟踪行号时,enumerate 特别有用。此示例显示了带有行号的错误报告。
try:
with open('data.txt') as f:
for line_num, line in enumerate(f, start=1):
line = line.strip()
if not line:
continue
print(f"Processing line {line_num}: {line}")
except FileNotFoundError:
print("Error: File not found")
此代码逐行读取文件,同时跟踪行号。 跳过空行,并显示每个处理过的行及其编号。
行号对于错误消息很有价值,可以更轻松地定位输入文件中的问题。
从 Enumerate 创建字典
enumerate 可以帮助创建将值映射到其位置的字典。此示例构建了单词到索引的映射。
words = ['apple', 'banana', 'cherry', 'date']
# Create dictionary mapping words to their indices
word_index = {word: i for i, word in enumerate(words)}
print(word_index)
# Output: {'apple': 0, 'banana': 1, 'cherry': 2, 'date': 3}
# With custom start
word_index_1 = {word: i for i, word in enumerate(words, start=1)}
print(word_index_1)
# Output: {'apple': 1, 'banana': 2, 'cherry': 3, 'date': 4}
此字典推导式使用 enumerate 有效地创建查找表。第二个版本展示了如何调整编号方案。
这种映射在自然语言处理和数据预处理管道中很常见。
最佳实践
- 优先于 range(len()): 更具可读性和 Python 风格
- 使用有意义的名称: 例如 (index, value) 而不是 (i, x)
- 考虑 start 参数: 当需要从 1 开始的编号时
- 适用于任何可迭代对象: 列表、元组、字符串、文件
- 内存高效: 不创建中间列表
资料来源
作者
列出所有 Python 教程。