在python中遍历列表时删除元素

Remove elements as you traverse a list in Python

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

在Java中,我可以通过使用EDCOX1×0来实现,然后使用迭代器的EDCOX1×1的方法来删除迭代器返回的最后一个元素,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import java.util.*;

public class ConcurrentMod {
    public static void main(String[] args) {
        List<String> colors = new ArrayList<String>(Arrays.asList("red","green","blue","purple"));
        for (Iterator<String> it = colors.iterator(); it.hasNext(); ) {
            String color = it.next();
            System.out.println(color);
            if (color.equals("green"))
                it.remove();
        }
        System.out.println("At the end, colors =" + colors);
    }
}

/* Outputs:
red
green
blue
purple
At the end, colors = [red, blue, purple]
*/

我该如何在python中做到这一点?当我在for循环中迭代该列表时,我不能修改它,因为它会导致跳过某些内容(请参见此处)。而且似乎没有等同于Java的EDCOX1 0接口。


python的最佳方法是创建一个新的列表,最好是在listcomp中,将其设置为旧列表的[:],例如:

1
colors[:] = [c for c in colors if c != 'green']

并不像某些答案所暗示的那样,colors =只会重新命名,最终会留下一些对旧"身体"的引用;colors[:] =在所有方面都要好得多;—)。


迭代列表的副本:

1
2
3
for c in colors[:]:
    if c == 'green':
        colors.remove(c)


您可以使用过滤功能:

1
2
3
4
>>> colors=['red', 'green', 'blue', 'purple']
>>> filter(lambda color: color != 'green', colors)
['red', 'blue', 'purple']
>>>

或者你也可以这样做

1
2
3
>>> colors = ['red', 'green', 'blue', 'purple']
>>> if colors.__contains__('green'):
...     colors.remove('green')