Python:迭代一个列表,但我想在循环中添加到该列表并继续迭代添加的内容。

Posted

技术标签:

【中文标题】Python:迭代一个列表,但我想在循环中添加到该列表并继续迭代添加的内容。【英文标题】:Python: Iterating over a list, but I want to add to that list while in the loop and continue iterating over what was added. 【发布时间】:2018-07-14 05:06:38 【问题描述】:

只是试图做这样的事情。我想继续追加到 lst,并继续迭代添加的内容。

lst = [secondLst]

for i in lst:

    *some code*

    lst.append(x)

我最终会在 for 循环中到达 x。

这可能吗? 有没有更好的办法?

【问题讨论】:

你可以使用collections.deque,在不同的侧面使用popappend 你试了是不是不行? @StefanPochmann 不,它没有。我不确定为什么不。 【参考方案1】:

是的,它工作正常。在内部,Python 维护一个列表索引,在每次迭代时将其递增 1,并且每次都根据列表的当前长度重新检查它。列表长度在循环开始时被捕获。所以,例如:

>>> L = [10, 20, 30]
>>> for i, v in enumerate(L):
...     print(v)
...     if i < 3:
...         L.append(i)

10
20
30
0
1
2

不过,更明确地这样做可能会更清楚。例如:

>>> import itertools
>>> L = [10, 20, 30]
>>> extras = []
>>> for i, v in enumerate(itertools.chain(L, extras)):
...     print(v)
...     if i < 3:
...         extras.append(i)

你可以read the docs:

注意:当循环修改序列时有一个微妙之处(这只会发生在可变序列,即列表中)。内部计数器用于跟踪接下来使用哪个项目,并在每次迭代时递增。当此计数器达到序列的长度时,循环终止。这意味着如果套件从序列中删除当前(或前一个)项目,则将跳过下一个项目(因为它获取已处理的当前项目的索引)。同样,如果套件在当前项之前插入序列中的一项,则当前项将在下一次循环中再次处理。

【讨论】:

这是不正确的。 enumerate 复制列表,您也不会重复添加。 @NoticeMeSenpai,不是这样。运行代码。它工作正常。 enumerate() 不复制任何内容。如果您是对这个答案投反对票的人,您应该撤回它;-) @StefanPochmann,请参阅刚才的编辑以获取文档参考。它明确指出了可能出现的错误,但您也可以从中推断出我已经描述过的行为。 我不确定这是否是一个好方法。根据 OP 的原始代码,他们似乎想直接添加到正在迭代的list。在这种情况下,它很容易创建一个无限循环,因为索引永远不会到达末尾。我认为指出您的 if i &lt; 3: 的使用很重要,这样 OP 就不会陷入无限循环。 @TimPeters 嗯,这听起来确实很有说服力。不久前,我努力寻找正确记录但失败了。当我asked him recently 时,Martijn Pieters 似乎也没有意识到那张纸条。不确定我以前没有看过这张纸条,也没有看过,但仍然不完全相信它。它没有说明 counter-vs-length 检查到底是什么时候完成的,我认为它可以在获取一个元素之后立即完成,然后再将它提供给循环体,所以 append when你已经在...

以上是关于Python:迭代一个列表,但我想在循环中添加到该列表并继续迭代添加的内容。的主要内容,如果未能解决你的问题,请参考以下文章

用于迭代 Python 列表的开始索引

使用 Ruby/Erlang 迭代生成排列,无需递归或堆栈

迭代时从Python列表中删除项目[重复]

python如何在完成每个循环后从列表中清除项目?

我想在 python 中使用 while 循环创建简单列表 [0, 0.05, 0.10, 0.15,.....,1.00]

在 Python 中以列表(循环方式)迭代对