python:从nums中删除val的两个程序

python:从nums中删除val的两个程序,python,Python,编写python程序从数组中删除val: 第一个方案是: class Solution(object): def removeElement(self,nums,val): for x in nums: if x == val: nums.remove(val) return len(nums) 当nums为[3,3]时,val为3,输出为:1 第二个方案是: class Solution(obj

编写python程序从数组中删除val: 第一个方案是:

class Solution(object):
    def removeElement(self,nums,val):

        for x in nums:
            if x == val:
                nums.remove(val)
        return len(nums)
当nums为[3,3]时,val为3,输出为:1

第二个方案是:

class Solution(object):
    def removeElement(self,nums,val):

        while val in nums:
            nums.remove(val)
        return len(nums)
nums为[3,3],val为3,输出为:0


您能告诉我区别和原因吗?

Python在迭代过程中很难遍历正在更改的内容。它可能会失败或返回意外的结果,或者永远不会退出迭代

因为一个容器甚至没有跟踪出的迭代器 在它上面,更不用说钩子了,甚至改变了循环的方法 迭代器,并以某种方式神奇地让每个迭代器知道 改动。这将是一个非常微妙、复杂的代码和检查 减慢非常频繁的操作

上述代码不会退出迭代。因此正确的方法是使用列表理解创建一个新列表,其中只包含您不想删除的元素:

print([i for i in nums if i!=val])
或就地变更:

nums[:] = [i for i in nums if i!=val]

希望这能有所帮助。

在第一个示例中,您在迭代列表中的元素时删除了列表中的一个元素。这是一个问题,因为在第一次
remove
之后,迭代将用完

例如,如果列表是
l=[1,1,2,2]
,并且在删除第一个
2
后调用
removeElement(l,2)
,那么
l
的长度将是3,并且不会剩下任何迭代(列表将是
[1,1,2]
您将处于第3次迭代,这就是循环停止并返回的原因
[1,1,2]

在第二种情况下,
while
语句是:当列表中仍然有2时,继续从列表中删除2。这样,在第一次迭代之后,
l
将看起来像
[1,1,2]
,其中仍然有一个2,因此循环继续,您将得到
[1,1]

您可以使用
l=[3,3]
将此示例应用到您的案例中,看看您是否理解它


希望有帮助:)

在数组中循环,同时从数组中删除元素通常会导致奇怪的行为和问题。
nums[:] = [i for i in nums if i!=val]