Python for循环遍历列表并删除元素时无法遍历全部数据是什么原因?
问题根本原因
你遇到的异常遍历现象核心是在遍历Python列表的同时修改了原列表的长度,导致遍历索引出现偏移:
- Python的for循环遍历列表时是按索引顺序依次取值的,遍历前会固定初始的遍历索引计数,不会因为列表长度变化动态调整
- 你给出的示例执行过程如下:
- 初始
data = [1,2,3,4,5],长度为5,for循环计划依次取索引0、1、2、3、4对应的元素 - 第一次循环取索引0的元素
1,输出1,检测到出现次数为1,执行remove(1),此时列表变为[2,3,4,5],长度变为4 - 第二次循环按计数取下一个索引1,此时列表索引1对应的元素是
3(原索引2的元素),输出3,检测到出现次数为1,执行remove(3),列表变为[2,4,5],长度变为3 - 第三次循环按计数取下一个索引2,此时列表索引2对应的元素是
5(原索引4的元素),输出5,检测到出现次数为1,执行remove(5),列表变为[2,4],长度变为2 - 第四次循环要取索引3,已经超过当前列表的最大索引1,循环直接终止,最终输出就是1、3、5
- 初始
正确实现方案
不要在遍历原列表的同时修改原列表,推荐先统计元素出现频率,再通过列表推导式生成符合要求的新列表,示例代码如下:
from collections import Counter def remove_unique_elements(data): count = Counter(data) # 只保留出现次数≥2的元素 return [x for x in data if count[x] >= 2]
如果不想引入额外依赖,也可以直接用list.count()写推导式,不过数据量大的时候执行效率会低于Counter方案:
def remove_unique_elements(data): return [x for x in data if data.count(x) >= 2]
内容的提问来源于stack exchange,提问作者Robert Gorak
相关产品推荐
相关产品推荐

