python中enumerate()函数的使用
enumerate() 是 Python 中遍历列表(或可迭代对象)并同时获取「索引+元素」 的内置函数,核心作用是避免手动维护索引变量(如 i = 0; for x in list: ...; i +=1),让代码更简洁高效。
一、基本用法:遍历索引+元素
语法
enumerate(iterable, start=0)iterable:要遍历的可迭代对象(列表、元组、字符串等,常用列表);start:索引的起始值(默认是0,可自定义,如start=1从 1 开始计数);- 返回值:迭代器,每次迭代返回一个
(索引, 元素)的元组。
示例1:默认索引从 0 开始
fruits =["苹果","香蕉","橙子","葡萄"]# 用 enumerate 遍历列表(默认 start=0)for index, fruit inenumerate(fruits):print(f"索引 {index}:元素 {fruit}")输出:
索引 0:元素 苹果 索引 1:元素 香蕉 索引 2:元素 橙子 索引 3:元素 葡萄 示例2:自定义索引从 1 开始(start=1)
fruits =["苹果","香蕉","橙子","葡萄"]# 索引从 1 开始(适合场景:序号展示、排名等)for index, fruit inenumerate(fruits, start=1):print(f"第 {index} 个水果:{fruit}")输出:
第 1 个水果:苹果 第 2 个水果:香蕉 第 3 个水果:橙子 第 4 个水果:葡萄 二、核心优势:对比传统遍历(无 enumerate)
没有 enumerate() 时,要获取索引需手动维护变量,代码冗余且易出错:
fruits =["苹果","香蕉","橙子","葡萄"]# 传统方式:手动维护索引 i i =0for fruit in fruits:print(f"索引 {i}:元素 {fruit}") i +=1# 必须手动递增,忘记写就会出错- 用
enumerate()可直接省略i的定义和递增,代码更简洁、不易出错。
三、进阶用法
1. 遍历列表时修改元素(需注意:不能直接改迭代对象,要通过索引改原列表)
nums =[1,2,3,4]# 遍历索引和元素,将每个元素翻倍for idx, num inenumerate(nums): nums[idx]= num *2# 通过索引修改原列表print("修改后的列表:", nums)# 输出:[2, 4, 6, 8]2. 结合条件筛选(按索引/元素过滤)
fruits =["苹果","香蕉","橙子","葡萄","芒果"]# 筛选出索引为偶数的元素(0、2、4)for idx, fruit inenumerate(fruits):if idx %2==0:print(f"索引 {idx}(偶数):{fruit}")输出:
索引 0(偶数):苹果 索引 2(偶数):橙子 索引 4(偶数):芒果 3. 与 list() 结合,直接生成「索引-元素」元组列表
fruits =["苹果","香蕉","橙子"]# 生成包含 (索引, 元素) 的列表 indexed_fruits =list(enumerate(fruits, start=1))print(indexed_fruits)# 输出:[(1, '苹果'), (2, '香蕉'), (3, '橙子')]4. 遍历多维列表(嵌套列表)
matrix =[[1,2],[3,4],[5,6]]# 遍历二维列表的「行索引+行内容+列索引+列元素」for row_idx, row inenumerate(matrix):for col_idx, val inenumerate(row):print(f"行 {row_idx} 列 {col_idx}:{val}")输出:
行 0 列 0:1 行 0 列 1:2 行 1 列 0:3 行 1 列 1:4 行 2 列 0:5 行 2 列 1:6 四、常见误区
混淆 start 参数的作用:start 只改变索引的显示值,不改变列表的实际索引(原列表的索引仍从 0 开始):
fruits =["苹果","香蕉"]for idx, fruit inenumerate(fruits, start=100):print(f"显示索引 {idx},实际列表索引 {idx-100}:{fruit}")输出:
显示索引 100,实际列表索引 0:苹果 显示索引 101,实际列表索引 1:香蕉 试图直接修改迭代对象(错误):enumerate() 返回的是元组 (idx, 元素),元组不可修改,若想改元素需通过原列表的索引:
nums =[1,2,3]for idx, num inenumerate(nums): num = num *2# 错误:只修改了临时变量 num,原列表不变print(nums)# 输出:[1, 2, 3](无变化)正确做法:nums[idx] = num * 2(通过索引修改原列表)。
五、总结
enumerate() 是列表遍历的「效率工具」,核心场景:
- 需要同时获取元素和它的位置(索引);
- 避免手动维护索引变量,简化代码;
- 支持自定义索引起始值(如序号、排名等场景)。
记住核心用法:for idx, elem in enumerate(列表, start=起始值):,几乎能覆盖所有列表遍历需索引的场景!