在Python的for循环里同时获取索引和对应元素是常见的开发需求,比如我们需要对列表元素做标记、根据位置筛选内容时,就需要同时拿到这两个信息。下面介绍几种实现该需求的方法。
方法一:使用enumerate函数(推荐方案)
enumerate是Python内置的专门用于遍历时同时获取索引和元素的方法,它会将可迭代对象组合为一个索引序列,返回(index, element)形式的元组,使用起来非常简洁。
基础用法示例如下:
fruits = ["苹果", "香蕉", "橙子", "葡萄"]
# 同时获取索引和元素
for index, fruit in enumerate(fruits):
print(f"索引:{index},元素:{fruit}")
如果需要指定索引起始值,可以给enumerate传入start参数:
fruits = ["苹果", "香蕉", "橙子", "葡萄"]
# 索引起始值设为1
for index, fruit in enumerate(fruits, start=1):
print(f"第{index}个水果是:{fruit}")
方法二:使用range配合len函数
这是比较传统的实现方式,通过range生成索引范围,再通过索引访问对应元素,适合需要明确控制索引范围的场景。
代码示例:
fruits = ["苹果", "香蕉", "橙子", "葡萄"]
# 遍历索引范围
for i in range(len(fruits)):
print(f"索引:{i},元素:{fruits[i]}")
这种方式的缺点是需要额外调用len函数获取长度,代码可读性不如enumerate,而且如果可迭代对象不支持len方法就无法使用。
两种方案对比
我们可以通过下表对比两种方案的特点:
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| enumerate函数 | 语法简洁,可读性强,支持任意可迭代对象 | 无 | 绝大多数需要同时获取索引和元素的场景 |
| range+len | 可以灵活控制索引范围 | 代码冗余,可读性差,依赖对象支持len方法 | 需要自定义索引范围的特殊场景 |
注意事项
- 使用enumerate时,解包的两个变量顺序必须是先索引后元素,顺序颠倒会导致赋值错误
- 如果只需要索引不需要元素,不需要刻意用enumerate,直接用range遍历即可
- enumerate返回的是迭代器,不会一次性把所有数据存储到内存中,适合处理大型可迭代对象
实际开发中优先选择enumerate函数来实现for循环中同时获取索引和元素的需求,能让代码更简洁规范。