遍历列表时同时要索引和元素,常见写法是配合 range(len(...))

fruits = ["apple", "banana", "cherry"]
 
for i in range(len(fruits)):
    print(i, fruits[i])

内置函数 enumerate() 把索引和元素打包成 (index, value),循环里直接解包:

for i, fruit in enumerate(fruits):
    print(i, fruit)

两种写法输出一样:

0 apple
1 banana
2 cherry

基本用法

enumerate(iterable, start=0) 接受任意可迭代对象,每次迭代产出一个元组,第一个元素是索引,第二个是原值。索引默认从 0 开始。

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

字符串、元组、dict 的 key 都可以直接遍历:

for i, ch in enumerate("abc"):
    print(i, ch)
 
for i, key in enumerate({"a": 1, "b": 2}):
    print(i, key)

start 参数

序号需要从 1 开始时传 start=1

for i, fruit in enumerate(fruits, start=1):
    print(i, fruit)

start 接受任意整数,包括负数:

list(enumerate(["a", "b"], start=-1))
# [(-1, 'a'), (0, 'b')]

原理

enumerate() 返回的是一个迭代器(iterator),按需生成 (index, value),不会提前把所有元组算出来。想看完整内容时用 list() 转换。

迭代器只能遍历一次,遍历结束后对象就空了:

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

常见用法

给结果加序号输出:

for i, name in enumerate(names, start=1):
    print(f"{i}. {name}")

把列表转成 {索引: 元素} 的 dict:

dict(enumerate(["a", "b", "c"]))
# {0: 'a', 1: 'b', 2: 'c'}

找元素位置时,条件命中后直接拿索引:

for i, value in enumerate(nums):
    if value > 10:
        print(i)
        break

dict 要同时拿 key 和 value,先用 items() 再包一层:

person = {"name": "Youyou", "age": 18}
 
for i, (key, value) in enumerate(person.items()):
    print(i, key, value)

与手工写法对比

写法代码说明
range(len(...))for i in range(len(xs)): xs[i]要再写一次下标取值
手工计数器i = 0,循环末尾 i += 1容易漏掉自增
enumerate()for i, x in enumerate(xs)索引和值一次拿到