14

在 Java 中,我可以使用 anIterator然后使用迭代器的.remove()方法来删除迭代器返回的最后一个元素,如下所示:

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 循环中迭代列表时,我无法修改列表,因为它会导致内容被跳过(请参见此处)。而且似乎没有Iterator与Java接口等效的东西。

4

4 回答 4

30

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

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

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

于 2009-08-30T02:26:57.367 回答
24

遍历列表的副本

for c in colors[:]:
    if c == 'green':
        colors.remove(c)
于 2009-08-30T02:26:57.397 回答
4

您可以使用过滤功能:

>>> colors=['red', 'green', 'blue', 'purple']
>>> filter(lambda color: color != 'green', colors)
['red', 'blue', 'purple']
>>>
于 2009-08-30T02:57:35.790 回答
0

或者你也可以这样做

>>> colors = ['red', 'green', 'blue', 'purple']
>>> if colors.__contains__('green'):
...     colors.remove('green')
于 2009-08-30T04:34:40.797 回答