You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 19:45:03