Все ответы выше (кроме ответа Мартина Андерссона) создают новый список без нужных элементов, а не удаляют элементы из исходного списка.
>>> import random, timeit
>>> a = list(range(5)) * 1000
>>> random.shuffle(a)
>>> b = a
>>> print(b is a)
True
>>> b = [x for x in b if x != 0]
>>> print(b is a)
False
>>> b.count(0)
0
>>> a.count(0)
1000
>>> b = a
>>> b = filter(lambda a: a != 2, x)
>>> print(b is a)
False
Это может быть важно, если у вас есть другие ссылки на список вокруг.
Чтобы изменить список на месте, используйте метод, подобный этому
>>> def removeall_inplace(x, l):
... for _ in xrange(l.count(x)):
... l.remove(x)
...
>>> removeall_inplace(0, b)
>>> b is a
True
>>> a.count(0)
0
Что касается скорости, результаты на моем ноутбуке (все в списке из 5000 записей с удалением 1000 записей)
- Понимание списка - ~ 400us
- Фильтр - ~ 900us
- .remove () loop - 50 мс
Так что цикл .remove примерно в 100 раз медленнее ........ Хм, возможно, нужен другой подход. Самое быстрое, что я нашел, это использование понимания списка, но затем заменим содержимое исходного списка.
>>> def removeall_replace(x, l):
.... t = [y for y in l if y != x]
.... del l[:]
.... l.extend(t)
- removeall_replace () - 450us