首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么for循环只执行一次?

为什么for循环只执行一次?
EN

Stack Overflow用户
提问于 2018-02-01 16:29:09
回答 6查看 78关注 0票数 0

我试图删除nums中的val值。

代码语言:javascript
运行
复制
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,我希望有人能帮我解释一下。谢谢。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2018-02-01 16:39:58

这是一个很好的例子,说明了为什么您不应该在迭代列表时修改它。List有点不寻常,因为它实际上允许您以相当可预测的方式进行修改。如果您尝试,许多其他可迭代对象都会引发错误。

当您执行for i in nums时,它将转换为for i in iter(nums)。列表上的迭代器跟踪您所处的索引。下面是循环中发生的情况:

  1. nums[3, 3],迭代器位于零位置: 3,3^
  2. 该项目与val匹配,因此将其删除。列表被移回一个项目: 3^
  3. 迭代器向前移动一个项。这是列表的结尾,因此迭代停止: 3^

每当列表中有任意一对匹配元素时,就会发生这种情况。如果您的列表是[3, 4, 3],则不会发生

  1. 开始 3,4,3^
  2. 删除 4,3^
  3. 增量 4,3^
  4. 删除 四^
  5. 结束

有几种获得过滤列表的方法。在其他答案中,最明显的是列出一个新的列表,通常是通过理解:

代码语言:javascript
运行
复制
nums = [x for x in nums if x != val]

然而,也有一个就地的解决方案。这并不是真正的最佳,但对于你必须工作的情况下,这是一种可能性。如果明智地迭代索引,则始终可以实现自己的迭代步骤:

代码语言:javascript
运行
复制
i = 0
while i < len(nums):  # Note that len is called in every iteration
    if nums[i] == val:
        nums.remove[i]
    else:
        i += 1

如果您的方法由于某些原因无法返回列表,那么这样的方法是个好主意。

事后考虑,您甚至可以在理解的情况下进行就地过滤:

代码语言:javascript
运行
复制
nums[:] = [x for x in nums if x != val]

这将创建一个临时列表,并将其内容分配给nums的内容,但不更改nums引用的对象。

票数 1
EN

Stack Overflow用户

发布于 2018-02-01 16:35:47

不要在迭代列表时删除(或更改)列表。

理解将解决你的问题:

代码语言:javascript
运行
复制
nums = [i for i in nums if i != val]

你的案子怎么回事?

  1. 你查过名单了。
  2. 第一个元素是3
  3. 你把它拿走了。
  4. 第二元素成为第一元素。
  5. 您已经检查了第一个元素,所以现在跳过了。
  6. 循环结束。
  7. 你和[3]在一起。
票数 0
EN

Stack Overflow用户

发布于 2018-02-01 16:38:48

正如@tobias_k在评论中所说的,在迭代列表时从列表中删除项是个坏主意。相反,您应该跟踪另一个不等于参数val的项列表。

代码语言:javascript
运行
复制
def removeElement(self, nums, val):
    if not nums:
        return []
    remaining = []
    for num in nums:
        if num != val:
            remaining.append(num)
    return remaining

就你的目的而言,我上面的内容在逻辑上相当于其他答案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48567463

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档