Этот вопрос уже имеет ответ здесь:
Я ищу способ удалить все значения в рамках списка из другого списка.
Что-то вроде этого:
a = range(1,10)
a.remove([2,3,7])
print a
a = [1,4,5,6,8,9]
>>> a = range(1, 10)
>>> [x for x in a if x not in [2, 3, 7]]
[1, 4, 5, 6, 8, 9]
Самый простой способ -
>>> a = range(1, 10)
>>> for x in [2, 3, 7]:
... a.remove(x)
...
>>> a
[1, 4, 5, 6, 8, 9]
Одна из возможных проблем заключается в том, что каждый раз, когда вы вызываете remove (), все элементы перемещаются вниз по списку, чтобы заполнить отверстие. Таким образом, если a
становится очень большим, это в конечном итоге будет довольно медленным.
Таким образом создается новый список. Преимущество состоит в том, что мы избегаем перетасовки первого подхода
>>> removeset = set([2, 3, 7])
>>> a = [x for x in a if x not in removeset]
. Если вы хотите изменить a
на месте, требуется всего одно небольшое изменение
>>> removeset = set([2, 3, 7])
>>> a[:] = [x for x in a if x not in removeset]
a = range(1,10)
itemsToRemove = set([2, 3, 7])
b = filter(lambda x: x not in itemsToRemove, a)
или
b = [x for x in a if x not in itemsToRemove]
Не создавайте набор внутри лямбда
или внутри понимания. Если вы это сделаете, он будет воссоздаваться на каждой итерации, что вообще лишает смысла использование набора.
>>> a=range(1,10)
>>> for i in [2,3,7]: a.remove(i)
...
>>> a
[1, 4, 5, 6, 8, 9]
>>> a=range(1,10)
>>> b=map(a.remove,[2,3,7])
>>> a
[1, 4, 5, 6, 8, 9]
Другие предлагали способы создания нового списка после фильтрации, например
newl = [x for x in l if x not in [2,3,7]]
или
newl = filter(lambda x: x not in [2,3,7], l)
, но из вашего вопроса похоже, что вам нужна модификация на месте, чтобы вы могли это сделать, это также будет намного быстрее , если исходный список длинный, а элементы, подлежащие удалению, меньше
l = range(1,10)
for o in set([2,3,7,11]):
try:
l.remove(o)
except ValueError:
pass
print l
вывод: [1, 4, 5, 6, 8, 9]
Я проверяю исключение ValueError, поэтому оно работает, даже если элементы отсутствуют в исходном списке.
Также, если вам не нужно решение для модификации на месте от , S.Mark
проще.