我有一个代码段,需要在其中浏览项目列表,并删除已完成工作的项目,然后继续循环处理其余项目。
按照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
循环而不违反任何上述实践的方法是什么?
答案 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]