Python enumerate 与 zip
学习遍历索引和并行迭代 · 难度:入门 · +10XP
Python enumerate 与 zip
enumerate 和 zip 是 Python 中两个非常实用的内置函数,它们能让你在循环遍历时写出更简洁、更 Pythonic 的代码。enumerate 在遍历时为每个元素添加序号,zip 则将多个可迭代对象打包在一起同时遍历。
enumerate 基本用法
fruits = ['苹果', '香蕉', '橙子', '葡萄', '西瓜']
# 传统方式 (不推荐)
i = 0
for fruit in fruits:
print(f'{i}: {fruit}')
i += 1
# enumerate 方式 (推荐)
for i, fruit in enumerate(fruits):
print(f'{i}: {fruit}')
# 指定起始索引
for i, fruit in enumerate(fruits, start=1):
print(f'第{i}个: {fruit}')
# 输出: 第1个: 苹果, 第2个: 香蕉, ...
enumerate 的实际应用
# 查找元素的下标
def find_index(lst, target):
for i, item in enumerate(lst):
if item == target:
return i
return -1
# 同时处理序号和值
data = [95, 87, 92, 78, 88]
for rank, score in enumerate(data, start=1):
status = '优秀' if score >= 90 else '良好' if score >= 80 else '及格'
print(f'第{rank}名: {score}分 - {status}')
# 使用列表推导与 enumerate
names = ['Alice', 'Bob', 'Charlie']
name_dict = {i: name for i, name in enumerate(names, 1)}
print(name_dict) # {1: 'Alice', 2: 'Bob', 3: 'Charlie'}
zip 基本用法
names = ['Alice', 'Bob', 'Charlie']
scores = [95, 87, 92]
# 同时遍历多个列表
for name, score in zip(names, scores):
print(f'{name}: {score}分')
# 创建字典
score_dict = dict(zip(names, scores))
print(score_dict) # {'Alice': 95, 'Bob': 87, 'Charlie': 92}
# zip 长度不同时,按最短的截断
numbers = [1, 2, 3, 4, 5]
letters = ['a', 'b', 'c']
print(list(zip(numbers, letters))) # [(1,'a'), (2,'b'), (3,'c')]
# zip_longest 按最长的补齐
from itertools import zip_longest
print(list(zip_longest(numbers, letters, fillvalue=None)))
# [(1,'a'), (2,'b'), (3,'c'), (4,None), (5,None)]
组合使用 enumerate + zip
names = ['Alice', 'Bob', 'Charlie']
scores = [95, 87, 92]
grades = ['A', 'B', 'A']
# enumerate 和 zip 组合使用
for i, (name, score, grade) in enumerate(zip(names, scores, grades), start=1):
print(f'{i}. {name} - {score}分 - 等级{grade}')
# 输出:
# 1. Alice - 95分 - 等级A
# 2. Bob - 87分 - 等级B
# 3. Charlie - 92分 - 等级A
enumerate 与 zip 对比速查
| 函数 | 作用 | 典型用法 |
|---|---|---|
| enumerate(seq) | 为序列添加索引 | for i, val in enumerate(seq) |
| enumerate(seq, start=n) | 指定起始索引 | for i, val in enumerate(seq, 1) |
| zip(a, b) | 打包多个序列 | for x, y in zip(a, b) |
| zip(*matrix) | 解包矩阵(转置) | 对行列进行互换 |
| zip_longest(a, b) | 最长对齐打包 | from itertools import zip_longest |