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 教程。