Python列表删除指定值函数为何漏删了最后一个目标元素?
问题原因
你的代码出现漏删的核心原因是遍历列表的同时动态修改列表长度,触发了索引错位问题:
Python的for循环遍历列表时,会按顺序读取对应索引位置的元素,每完成一次循环索引自动+1。当你删除列表中的某一个元素后,该元素后方的所有元素会整体向前移动一位,索引全部减1,此时for循环的下一次读取会跳过被删元素后面紧邻的那个元素,最终就会出现部分目标值漏删的情况。
另外你的代码存在冗余写法:nums.remove(nums[nums.index(i)]) 等效于 nums.remove(i),remove方法本身就会删除列表中第一个匹配的元素。
可行修改方案
以下几个方案都可以实现所有匹配值的完全删除,按需选择即可:
方案1:列表推导式(最简洁,性能最优)
如果允许生成新列表,直接用列表推导式过滤掉等于val的元素即可:
def removeElement(nums,val): return [x for x in nums if x != val]
如果要求原地修改原列表(不生成新的列表对象),可以用切片赋值的写法:
def removeElement(nums,val): nums[:] = [x for x in nums if x != val] return nums
方案2:倒序遍历删除(原地修改,逻辑简单)
倒序遍历列表时,删除元素只会影响已经遍历过的、索引更大的元素,不会干扰后续未遍历的元素,不会出现索引错位:
def removeElement(nums,val): for i in range(len(nums)-1, -1, -1): if nums[i] == val: del nums[i] return nums
方案3:双指针法(原地修改,空间复杂度O(1))
适合对空间复杂度有要求的场景,不需要额外存储新列表,只需要两个指针遍历一次即可完成:
def removeElement(nums,val): slow = 0 for fast in range(len(nums)): if nums[fast] != val: nums[slow] = nums[fast] slow += 1 # 删除后面多余的元素 del nums[slow:] return nums
内容的提问来源于stack exchange,提问作者Clive Wong
相关产品推荐
相关产品推荐

