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'] |
并不像某些答案所暗示的那样,
迭代列表的副本:
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') |