Python调用remove删除列表大于100元素仅生效一次问题排查
问题根因
你遇到的是遍历动态修改的列表时索引偏移的典型问题,具体逻辑如下:
- Python的for循环遍历列表是按索引顺序依次读取元素的,你初始的列表索引对应为:
索引 0 1 2 3 4 5 值 37 66 88 111 245 33 - 当循环到索引3时,读到值111>100,调用
lst.remove(111)删除该元素,此时列表会自动把后面的元素往前补位,删除后的列表变成:索引 0 1 2 3 4 值 37 66 88 245 33 - 此时for循环已经处理完索引3,下一次会直接读取索引4的元素也就是33,原本在索引3位置的245直接被跳过,所以没有被判断和删除。
正确实现方案
方案1:遍历列表的副本修改原列表
遍历原列表的浅拷贝,修改操作作用在原列表上,避免索引偏移问题:
lst = [37, 66, 88, 111, 245, 33] # 遍历lst的切片副本,不会受原列表修改影响 for n in lst[:]: if n > 100: lst.remove(n) print(lst)
方案2:用列表推导式直接生成新列表(更推荐,性能更高)
不需要遍历修改原列表,直接筛选符合条件的元素生成新列表:
lst = [37, 66, 88, 111, 245, 33] lst = [n for n in lst if n <= 100] print(lst)
内容的提问来源于stack exchange,提问作者hdhdd
相关产品推荐
相关产品推荐

