Python遍历列表调用remove删除元素时遗漏最后一个目标元素问题
问题产生原因
你遇到的漏删问题是遍历列表的同时直接修改列表结构导致的:Python的for循环遍历列表本质是按索引依次取值,当你删除某一个元素后,该元素后面的所有元素都会自动向前移动一位,后续的遍历会直接跳过移动后恰好落在刚访问过的索引位置的元素,最终出现漏删。
以你给出的用例为例,当遍历到索引为2的第一个2时,执行删除操作后原索引为3的第二个2会移动到索引2的位置,此时for循环直接跳转到索引3继续遍历,这个移动过来的2就不会被检测到,最终导致末尾的2漏删。
解决方法
- 方法一:列表推导式(最推荐,性能最优、写法简洁)
直接生成符合要求的新列表替换原列表:
nums = [0,1,2,2,3,0,4,2] val = 2 nums = [i for i in nums if i != val] print(nums)
- 方法二:倒序遍历列表索引
倒序遍历索引时,删除元素只会影响已经遍历过的后半部分索引,不会干扰未遍历的前半部分,不会出现跳元素问题:
nums = [0,1,2,2,3,0,4,2] val = 2 for i in range(len(nums)-1, -1, -1): if nums[i] == val: del nums[i] print(nums)
- 方法三:遍历列表的浅拷贝
遍历原列表的切片拷贝,删除操作作用于原列表,遍历逻辑不受修改影响:
nums = [0,1,2,2,3,0,4,2] val = 2 # nums[:] 生成原列表的浅拷贝 for i in nums[:]: if i == val: nums.remove(i) print(nums)
内容的提问来源于stack exchange,提问作者maxmiljan
相关产品推荐
相关产品推荐

