python - 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
而不违反上述任何做法?
解决方案
通过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]
有关此的更多信息:如何在迭代时从列表中删除项目?
推荐阅读
- algorithm - 获取满足所有键的最少值
- laravel - Laravel 中的自定义多态类型
- java - 如何在鼠标移动创建的矩形上使用工具提示 - Java
- python - 运行假设时如何退出 pdb 调试?
- c# - 当同时撰写多封电子邮件时,Outlook 不会触发 AttachmentAdd 事件,但一封电子邮件除外
- json - 如何在 json 文件中使用变量?
- react-native - React Native webview with login facebook总是在发布模式下重定向到另一个url(仅限android)
- amazon-web-services - 如何从 AWS VPC 中的私有子网连接到 Internet?
- python - 如何在数据框列 pandas 中找到最接近所选数字的 5 个数字的索引?
- facebook-graph-api - DailogFlow 将线程控制传递给 Facebook Messenger