我试图删除nums中的val值。
nums=[3,3]
val=3
class Solution:
def removeElement(self, nums, val):
if not nums:
return []
for i in nums:
if i == val:
nums.remove(i)
return nums
例外:[]
输出:[3]
也许这是个愚蠢的question.But,我希望有人能帮我解释一下。谢谢。
发布于 2018-02-01 16:39:58
这是一个很好的例子,说明了为什么您不应该在迭代列表时修改它。List有点不寻常,因为它实际上允许您以相当可预测的方式进行修改。如果您尝试,许多其他可迭代对象都会引发错误。
当您执行for i in nums
时,它将转换为for i in iter(nums)
。列表上的迭代器跟踪您所处的索引。下面是循环中发生的情况:
nums
是[3, 3]
,迭代器位于零位置:
3,3^val
匹配,因此将其删除。列表被移回一个项目:
3^每当列表中有任意一对匹配元素时,就会发生这种情况。如果您的列表是[3, 4, 3]
,则不会发生
有几种获得过滤列表的方法。在其他答案中,最明显的是列出一个新的列表,通常是通过理解:
nums = [x for x in nums if x != val]
然而,也有一个就地的解决方案。这并不是真正的最佳,但对于你必须工作的情况下,这是一种可能性。如果明智地迭代索引,则始终可以实现自己的迭代步骤:
i = 0
while i < len(nums): # Note that len is called in every iteration
if nums[i] == val:
nums.remove[i]
else:
i += 1
如果您的方法由于某些原因无法返回列表,那么这样的方法是个好主意。
事后考虑,您甚至可以在理解的情况下进行就地过滤:
nums[:] = [x for x in nums if x != val]
这将创建一个临时列表,并将其内容分配给nums
的内容,但不更改nums
引用的对象。
发布于 2018-02-01 16:35:47
不要在迭代列表时删除(或更改)列表。
理解将解决你的问题:
nums = [i for i in nums if i != val]
你的案子怎么回事?
3
[3]
在一起。发布于 2018-02-01 16:38:48
正如@tobias_k在评论中所说的,在迭代列表时从列表中删除项是个坏主意。相反,您应该跟踪另一个不等于参数val
的项列表。
def removeElement(self, nums, val):
if not nums:
return []
remaining = []
for num in nums:
if num != val:
remaining.append(num)
return remaining
就你的目的而言,我上面的内容在逻辑上相当于其他答案。
https://stackoverflow.com/questions/48567463
复制相似问题