python中带有迭代器的while循环,它不断变化

Posted

技术标签:

【中文标题】python中带有迭代器的while循环,它不断变化【英文标题】:while loop with iterator in python which keeps on changing 【发布时间】:2019-07-22 12:26:51 【问题描述】:

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

根据 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

现在应该采用什么方法来处理带有listwhile 循环,这不会违反上述任何做法?

【问题讨论】:

while lwhile len(l) > 0' 含义完全相同:在布尔上下文中计算为 False 的唯一列表是空列表。 @ThierryLathuille 我会请求您再次完成整个查询。 @Jean-François。请在标记重复之前仔细阅读问题陈述。 How to remove items from a list while iterating? @PabitraPati 您的两个版本的代码完全相同,Pylint 对第二个版本的样式发出警告这一事实并没有改变这一点。问题仍然存在:您在迭代列表时删除了列表中的项目。简而言之,您可以将整个for循环替换为l = [t for t in l if t[wt] <= 10] 【参考方案1】:

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

【讨论】:

终于有新图了,+1 啊,你注意到了:) 哦,我没有,我很抱歉 :) 我只是希望不要仅仅因为我改变了我的照片而获得投票:)

以上是关于python中带有迭代器的while循环,它不断变化的主要内容,如果未能解决你的问题,请参考以下文章

生成器和迭代器的藕断丝连

python中for循环的底层实现机制 迭代

python函数--global,nonlocal ,新格式化输出,迭代器

带有int迭代器的Python循环[重复]

使用 for 语句和 while 语句向前移动迭代器的区别

初学者python笔记(迭代器生成器三元表达式列表解析send()与yield())