Python for循环遍历列表删除元素时部分实例被跳过的问题
遍历列表时删除元素导致跳过实例的原因及解决方法
问题原因
在for循环中直接遍历原列表并删除元素时,Python的列表迭代器是按索引顺序推进的。每次删除元素后,列表中后续元素会自动左移填补空缺,但迭代器的索引不会回退,直接跳到下一个位置,导致跳过了被删除元素的下一个元素。
拿你的代码举例:
- 初始列表:
[12, 25, 36, 48, 3, 5, 7, 2, 4, 13, 22, 19] - 第一次循环取
12,满足条件删除,列表变为[25, 36, 48, 3, 5, 7, 2, 4, 13, 22, 19],迭代器接下来指向索引1(对应元素36) - 删除
36后,列表变为[25, 48, 3, 5, 7, 2, 4, 13, 22, 19],迭代器直接跳到索引2(对应元素3),完全跳过了现在在索引1的48 - 后面删除
2时,4会左移到2原来的位置,但迭代器已经走到下一个索引,所以4也被跳过了。
解决方法
方法1:遍历列表的副本
通过遍历原列表的副本,修改原列表的操作不会影响遍历过程:
my_list = [12, 25, 36, 48, 3, 5, 7, 2, 4, 13, 22, 19] for num in my_list.copy(): # 遍历副本而非原列表 if num % 2 == 0: my_list.remove(num) print(my_list) # 输出: [25, 3, 5, 7, 13, 19]
方法2:使用列表推导式(推荐)
列表推导式是Python中筛选元素的高效方式,直接生成符合要求的新列表,从根源避免遍历修改原列表的问题:
my_list = [12, 25, 36, 48, 3, 5, 7, 2, 4, 13, 22, 19] my_list = [num for num in my_list if num % 2 != 0] print(my_list) # 输出: [25, 3, 5, 7, 13, 19]
方法3:倒序遍历列表
倒序遍历的时候,删除后面的元素不会影响前面元素的索引位置,迭代器从后往前推进,不会出现跳过的情况:
my_list = [12, 25, 36, 48, 3, 5, 7, 2, 4, 13, 22, 19] for num in reversed(my_list): if num % 2 == 0: my_list.remove(num) print(my_list) # 输出: [25, 3, 5, 7, 13, 19]
内容的提问来源于stack exchange,提问作者Bhargav Borkhatariya
相关产品推荐
相关产品推荐

