在Python中使用迭代器的while循环不断变化

时间:2019-02-28 14:45:24

标签: python

我有一个代码段,需要在其中浏览项目列表,并删除已完成工作的项目,然后继续循环处理其余项目。

按照python,我可以通过l来检查while循环的条件,如下所示:-

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

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

所以我将代码更改为:-

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)用作条件值:-reference

现在使用while处理list循环而不违反任何上述实践的方法是什么?

1 个答案:

答案 0 :(得分:4)

在您的情况下使用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]

有关此的更多信息:How to remove items from a list while iterating?