Удалять элементы при прохождении списка в Python
В 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.
4 ответа
Перебрать копию списка:
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')