Удалить все значения в рамках одного списка из другого списка? [дубликат]

Этот вопрос уже имеет ответ здесь:

Я ищу способ удалить все значения в рамках списка из другого списка.

Что-то вроде этого:

a = range(1,10)  
a.remove([2,3,7])  
print a  
a = [1,4,5,6,8,9]  
113
задан martineau 27 April 2017 в 18:52
поделиться

5 ответов

>>> a = range(1, 10)
>>> [x for x in a if x not in [2, 3, 7]]
[1, 4, 5, 6, 8, 9]
126
ответ дан 24 November 2019 в 02:41
поделиться

Самый простой способ -

>>> 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]
7
ответ дан 24 November 2019 в 02:41
поделиться
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]

Не создавайте набор внутри лямбда или внутри понимания. Если вы это сделаете, он будет воссоздаваться на каждой итерации, что вообще лишает смысла использование набора.

26
ответ дан 24 November 2019 в 02:41
поделиться
>>> 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]
5
ответ дан 24 November 2019 в 02:41
поделиться

Другие предлагали способы создания нового списка после фильтрации, например

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 проще.

6
ответ дан 24 November 2019 в 02:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: