【问题标题】:while loop with iterator in python which keeps on changingpython中带有迭代器的while循环,它不断变化
【发布时间】: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

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

【问题讨论】:

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

标签: python


【解决方案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
  • 啊,你注意到了:)
  • 哦,我没有,我很抱歉 :)
  • 我只是希望不要仅仅因为我改变了我的照片而获得投票:)
猜你喜欢
  • 1970-01-01
  • 2019-02-12
  • 1970-01-01
  • 2015-06-25
  • 1970-01-01
  • 2017-07-05
  • 2017-12-14
  • 2020-09-21
  • 2015-04-21
相关资源
最近更新 更多