关于python:从循环中的列表中删除项目

Removing items from a list in a loop

本问题已经有最佳答案,请猛点这里访问。

相当长一段时间以来,我一直在试图找到一种方法,通过一个列表循环并删除我当前所在的项目。我似乎不能像我想的那样把这个工作做好。它只循环1次,但我想循环2次。当我移除移除线时-它会循环2次。

1
2
3
4
a = [0, 1]
for i in a:
    z = a
    print z.remove(i)

输出:

1
[1]

我期望的输出:

1
2
[1]
[0]


您在对列表进行迭代的同时更改了它——z = a不生成副本,它只是将z指向同一位置a点。

尝试

1
2
3
for i in a[:]:          # slicing a list makes a copy
    print i             # remove doesn't return the item so print it here
    a.remove(i)         # remove the item from the original list

1
2
while a:                # while the list is not empty
    print a.pop(0)      # remove the first item from the list

如果不需要显式循环,可以删除与条件匹配且具有列表理解的项:

1
2
a = [i for i in a if i] # remove all items that evaluate to false
a = [i for i in a if condition(i)] # remove items where the condition is False


在循环浏览列表时修改列表是一种糟糕的做法?。创建列表的副本。例如。:

1
2
oldlist = ['a', 'b', 'spam', 'c']
newlist = filter(lambda x: x != 'spam', oldlist)

?为了解释为什么这可能是一个糟糕的实践,请考虑迭代过程中序列发生变化时迭代器在序列上进行的操作的实现细节。如果删除了当前项,迭代器应该指向原始列表中的下一项还是修改后列表中的下一项?如果您的决策过程将上一个(或下一个)项移到当前项,该怎么办?

有些人不喜欢过滤,等同于列表理解:

1
newlist = [x for x in oldlist if x != 'spam']


问题是您正在使用remove修改a,所以循环退出,因为索引现在已经超过了它的末尾。


循环列表时不要尝试删除列表中的多个项目。我认为这是一个一般规则,您不仅应该遵循Python,而且还应该遵循其他编程语言。

可以将要删除的项添加到单独的列表中。然后从原始列表中删除该新列表中的所有对象。