ZetCode

Python enumerate 函数

上次修改时间:2025 年 4 月 11 日

本篇完整指南将探索 Python 的 enumerate 函数,它为可迭代对象添加一个计数器。我们将介绍基本用法、实际示例和高级技巧,以便使用索引进行高效迭代。

基本定义

enumerate 函数返回一个枚举对象,该对象生成一系列元组。每个元组包含一个索引和可迭代对象中的相应值。

主要特性:适用于任何可迭代对象,接受可选的 start 参数,内存高效(惰性求值),并在 Python 3 中返回一个迭代器。

带有索引的基本迭代

这是一个简单的用法示例,展示了 enumerate 如何在迭代期间同时提供索引和值。 这消除了手动管理计数器。

basic_enumerate.py
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 参数,以便从特定数字开始计数。这对于非零基数的索引很有用。

start_parameter.py
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 对它们的处理方式有所不同。此示例演示了这种行为。

dict_enumerate.py
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 特别有用。此示例显示了带有行号的错误报告。

file_processing.py
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 可以帮助创建将值映射到其位置的字典。此示例构建了单词到索引的映射。

dict_creation.py
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 有效地创建查找表。第二个版本展示了如何调整编号方案。

这种映射在自然语言处理和数据预处理管道中很常见。

最佳实践

资料来源

作者

我叫 Jan Bodnar,是一位充满激情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直在撰写编程文章。 迄今为止,我已经撰写了 1,400 多篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 Python 教程