Удаляйте элементы при перемещении по списку в Python [дублировать]

StackOverflow https://stackoverflow.com/questions/1352885

Вопрос

На этот вопрос уже есть ответ здесь:

В 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.

Это было полезно?

Решение

Выполните итерацию по Копировать из списка:

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

Другие советы

Лучший подход в Python - создать новый список, в идеале в listcomp, установив его как [:] из старого, например:

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

НЕ colors = как могут подсказать некоторые ответы - это только переназначает имя и в конечном итоге оставит некоторые ссылки на старое "тело" оборванными; colors[:] = намного лучше по всем параметрам;-).

Вы могли бы использовать функцию фильтра:

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

или вы также можете сделать вот так

>>> colors = ['red', 'green', 'blue', 'purple']
>>> if colors.__contains__('green'):
...     colors.remove('green')
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top