python:从nums中删除val的两个程序
编写python程序从数组中删除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
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]