Skip to main content
Documents
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

Enumerate (枚举)

🚀 什么是 enumerate?

enumerate 是 Python 内置函数:

在遍历可迭代对象时,同时返回 “索引 + 元素”。

它让循环更简洁、更安全、更高效。

1. 基础用法:获取索引和值

for index, value in enumerate(["a", "b", "c"]):
    print(index, value)

输出:

0 a
1 b
2 c

2. 指定起始索引(start)

for i, v in enumerate(["a", "b", "c"], start=1):
    print(i, v)

输出:

1 a
2 b
3 c

3. enumerate 的 3 种常见用途

3.1 遍历列表获取 index(最常见)

for i, item in enumerate(items):
    ...

3.2 同步更新列表中的元素

for i, val in enumerate(nums):
    nums[i] = val * 2

3.3 遍历字符串(字符 + 位置)

for i, ch in enumerate("hello"):
    print(i, ch)

4. 和 zip 一起使用

用于处理双序列并包含索引:

for i, (a, b) in enumerate(zip(list1, list2)):
    print(i, a, b)

5. enumerate 的“解包式”使用

for entry in enumerate(["x", "y"]):
    print(entry)

输出:

(0, 'x')
(1, 'y')

也可以:

i, val = entry

6. enumerate 的高级技巧

6.1 捕获索引和元素,但不需要元素时

for i, _ in enumerate(items):
    print(i)

6.2 找到首次满足条件的下标(非常常用!!!!)

idx = next((i for i, v in enumerate(nums) if v == target), -1)

6.3 enumerate + sorted(按值排序,同时记录原始索引)

for i, v in sorted(enumerate(nums), key=lambda x: x[1]):
    print(i, v)

6.4 enumerate + list comprehension(更 Pythonic)

indexed = [(i, v) for i, v in enumerate(items)]

7. enumerate vs range(len())(为什么 enumerate 更好)

写法 可读性 安全性 Pythonic
for i in range(len(x)) ❌ 差 ❌ 容易越界
for i, v in enumerate(x)

理由:

  1. range(len()) 需要自己取元素(麻烦)
  2. 容易写错
  3. enumerate 可读性更高
  4. enumerate 不依赖“长度”概念(适用范围更广)

8. enumerate 的性能

enumerate 内部用 C 实现,性能非常高。

实际性能测试:

for i in range(len(a)): ...     # 慢
for i, v in enumerate(a): ...   # 快

enumerate 更快、更容易被 Python 优化。

9. 函数签名

enumerate(iterable, start=0)
  • iterable:列表、元组、字符串、生成器……
  • start:初始索引

返回:enumerate 对象(惰性迭代器)

list(enumerate("ab"))
# [(0, 'a'), (1, 'b')]

10. enumerate + 动态跳出循环

for i, v in enumerate(items):
    if v == target:
        break

11. 最 Pythonic 的写法(最佳实践)

11.1 遍历并需要索引 -> 必用 enumerate

for i, item in enumerate(items):
    ...

11.2 从 1 开始

for i, item in enumerate(items, 1):
    ...

11.3 查找位置

idx = next((i for i, x in enumerate(items) if x == "target"), None)

11.4 同时处理多序列 -> zip + enumerate

for i, (a, b) in enumerate(zip(list1, list2)):
    ...

总结:enumerate 的本质价值

  • 让循环更 Pythonic
  • 更安全、可读
  • 性能更高
  • 用法灵活,适合搭配解包、zip、生成器等

如果需要 index -> 一律用 enumerate。

如果不需要 index -> 一律用 for item in iterable。