Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从循环中正确修改python中循环的迭代器_Python_Loops_Iterator - Fatal编程技术网

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

如何从循环中正确修改python中循环的迭代器,python,loops,iterator,Python,Loops,Iterator,我基本上需要检查列表中的每个元素,如果符合某些条件,我想将其从列表中删除 比如说 list=['a','b','c','d','e'] 我基本上想写(原则上,而不是我试图实现的实际代码) 如果列表中的某个元素是“b”或“c”,请将其从列表中删除,然后选择下一个元素 但是 失败,因为当删除“b”时,循环将“d”而不是“c”作为下一个元素。那么,有没有一种方法比将元素存储在单独的列表中并在之后删除它们更快呢 谢谢。更简单的方法是使用列表的副本-可以使用从列表“开始”到“结束”的切片来完成,如下所示

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

比如说

list=['a','b','c','d','e']
我基本上想写(原则上,而不是我试图实现的实际代码)

如果列表中的某个元素是“b”或“c”,请将其从列表中删除,然后选择下一个元素

但是

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


谢谢。

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

for s in list[:]:
    if s=='b' or s=='c':
        list.remove(s)
您已经考虑过这一点,并且这足够简单,可以放在您的代码中,除非这个列表非常大,并且在代码的关键部分(例如,在动作游戏的主循环中)。在这种情况下,我有时会使用以下成语:

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
index=0
当索引
如果您可以创建列表副本,您可以这样做():


最好不要重新发明已有的东西。在这些情况下使用函数和lambda。它更像蟒蛇,看起来更干净

filter(lambda x:x not in ['b','c'],['a','b','c','d','e'])
或者,您可以使用列表理解

[x for x in ['a','b','c','d','e'] if x not in ['b','c']]

这正是itertools.ifilter的设计目的

from itertools import ifilter

ifilter(lambda x: x not in ['b', 'c'], ['a', 'b', 'c', 'd', 'e'])
将为您的列表返回一个生成器。如果您确实需要列表,可以使用将生成器转换为列表的标准技术之一创建它:

list(ifilter(lambda x: x not in ['b', 'c'], ['a', 'b', 'c', 'd', 'e']))


非常感谢你。我觉得有点惭愧没有想到这一点。再次感谢!实际上我想要一个循环中的一个循环,而你的最后一个例子是完美的。再次感谢。事实上,第二个示例中的列表理解比过滤器和lambda组合“更具Pythonic”。谢谢,但我需要将一个这样的循环放到另一个循环中,这样事情就会变得非常混乱。
from itertools import ifilter

ifilter(lambda x: x not in ['b', 'c'], ['a', 'b', 'c', 'd', 'e'])
list(ifilter(lambda x: x not in ['b', 'c'], ['a', 'b', 'c', 'd', 'e']))
[x for x in ifilter(lambda x: x not in ['b', 'c'], ['a', 'b', 'c', 'd', 'e'])]