首页 > 解决方案 > python中带有迭代器的while循环,它不断变化

问题描述

我有一个片段,我需要在其中迭代项目列表并删除其工作已完成的项目并继续循环其余项目。

根据python,我可以通过l以下方式检查while循环条件:-

l = [node1, node2, node3]
while l:
    #do something
    for t in l:
        if t[wt] > 10:
            l.remove(t)

但根据本指南,在迭代列表时修改列表不是一个好习惯。

所以我将代码更改为:-

l = [node1, node2, node3]
while len(l)>0:
    #do something
    for t in l:
        if t[wt] > 10:
            l.remove(t)

但后来我看到下面的pylint警告:-

[pylint] C1801:不要使用 len(SEQUENCE) 作为条件值:-参考

现在应该用什么方法来处理这个while循环list而不违反上述任何做法?

标签: python

解决方案


通过len(l)在您的条件下使用,您并没有改进您的代码,它仍然存在相同的错误(在内部for循环中迭代时删除项目),您只是降低了代码,添加了一个不相关的警告。

在内部循环中迭代时,您仍在删除元素。

for t in l:
    if t[wt] > 10:
        l.remove(t)

这可能会引发一个微妙的错误:如果需要删除 2 个连续元素,则跳过第二个元素,并且您的代码会执行两倍于您在循环之前避开的处理。

相反,您应该l最终使用列表推导重新计算

l = [node1, node2, node3]
while l:
   # do something then rebuild `l` 
   l = [t for t in l if t[wt] <= 10]

有关此的更多信息:如何在迭代时从列表中删除项目?


推荐阅读