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
,在不同的侧面使用pop
和append
。
你试了是不是不行?
@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 < 3:
的使用很重要,这样 OP 就不会陷入无限循环。
@TimPeters 嗯,这听起来确实很有说服力。不久前,我努力寻找正确记录但失败了。当我asked him recently 时,Martijn Pieters 似乎也没有意识到那张纸条。不确定我以前没有看过这张纸条,也没有看过,但仍然不完全相信它。它没有说明 counter-vs-length 检查到底是什么时候完成的,我认为它可以在获取一个元素之后立即完成,然后再将它提供给循环体,所以 append
when你已经在...以上是关于Python:迭代一个列表,但我想在循环中添加到该列表并继续迭代添加的内容。的主要内容,如果未能解决你的问题,请参考以下文章
我想在 python 中使用 while 循环创建简单列表 [0, 0.05, 0.10, 0.15,.....,1.00]