删除元素你遍历在Python列表[复制](Remove elements as you traver

2019-07-04 02:07发布

这个问题已经在这里有一个答案:

  • 如何从一个列表,而迭代删除项目? 25个回答

在Java中,我可以通过使用做Iterator ,然后使用.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接口。

Answer 1:

遍历列表的副本

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


Answer 2:

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

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

NOT colors =一些答案可能暗示-只有重新绑定名字,并最终离开旧的“身体”晃来晃去一些参考; colors[:] =是在所有计数;-)要好得多。



Answer 3:

您可以使用过滤功能:

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


Answer 4:

或者你也可以像这样

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


文章来源: Remove elements as you traverse a list in Python [duplicate]