遍历列表时同时要索引和元素,常见写法是配合 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)
breakdict 要同时拿 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) | 索引和值一次拿到 |