python - 如何从循环内正确修改python中循环的迭代器

标签 python loops iterator

我基本上需要的是检查列表中的每个元素,如果符合某些条件,我想将其从列表中删除。

举个例子吧

list=['a','b','c','d','e']

我基本上想写(原则上而不是我尝试实现的实际代码)

如果列表中的元素是 'b' 或 'c',则将其从列表中移除并取下一个元素。

但是

for s in list:
    if s=='b' or s=='c':
        list.remove(s)

失败是因为当“b”被移除时,循环将“d”而不是“c”作为下一个元素。那么有没有比将元素存储在单独的列表中然后删除它们更快的方法呢?

谢谢。

最佳答案

更简单的方法是使用列表的副本 - 可以使用从列表的“开头”延伸到列表的“结尾”的切片来完成,如下所示:

for s in list[:]:
    if s=='b' or s=='c':
        list.remove(s)

你已经考虑过了,这很简单,可以放在你的代码中,除非这个列表真的很大,而且在代码的关键部分(比如,在 Action 游戏的主循环中)。在那种情况下,我有时会使用以下成语:

to_remove = []
for index, s in enumerate(list):
    if s == "b" or s == "c":
         to_remove.append(index)

for index in reversed(to_remove):
    del list[index]

当然,您可以改用 while 循环:

index = 0
while index < len(list):
   if s == "b" or s == "c":
       del list[index]
       continue
   index += 1

关于python - 如何从循环内正确修改python中循环的迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8544559/

相关文章:

c++ - move_iterator 对于返回纯右值的迭代器被破坏并返回悬空引用

javascript - 比较多个点之间的距离

Python 字符串与相应索引匹配

python - Python无效语法...?

python - 如何在 matplotlib 中使用混合 +ve 和 -ve 值绘制 100% 堆叠条形?

java - 如何创建一个循环来计算一个特定数字可以安装在另一个特定数字中的次数?

javascript - setTimeout 调用顺序

perl 'last' 语句和变量范围

iterator - Vec <Vec <(K,V)>>的可变迭代器

具有特定扩展名 "html"的 Python 文件 IO 失败