Удалить все вхождения значения из списка?

В Python remove() удалит первое вхождение значения в списке.

Как удалить все вхождения значения из списка?

Вот что я имею в виду:

>>> remove_values_from_list([1, 2, 3, 4, 2, 2, 3], 2)
[1, 3, 4, 3]

Ответ 1

Функциональный подход:

2.x

>>> x = [1,2,3,2,2,2,3,4]
>>> filter(lambda a: a != 2, x)
[1, 3, 3, 4]

3.x

>>> x = [1,2,3,2,2,2,3,4]
>>> list(filter((2).__ne__, x))
[1, 3, 3, 4]

или

>>> x = [1,2,3,2,2,2,3,4]
>>> list(filter(lambda a: a != 2, x))
[1, 3, 3, 4]

Ответ 2

Вы можете использовать понимание списка:

def remove_values_from_list(the_list, val):
   return [value for value in the_list if value != val]

x = [1, 2, 3, 4, 2, 2, 3]
x = remove_values_from_list(x, 2)
print x
# [1, 3, 4, 3]

Ответ 3

Вы можете использовать назначение среза, если исходный список должен быть изменен, но при этом используется эффективное понимание списка (или выражение генератора).

>>> x = [1, 2, 3, 4, 2, 2, 3]
>>> x[:] = (value for value in x if value != 2)
>>> x
[1, 3, 4, 3]

Ответ 4

Повторение решения первого сообщения более абстрактным образом:

>>> x = [1, 2, 3, 4, 2, 2, 3]
>>> while 2 in x: x.remove(2)
>>> x
[1, 3, 4, 3]

Ответ 5

См. простые решения

Решение 1:

>>> [i for i in x if i != 2]

Это вернет список, содержащий все элементы x без 2

Решение 2:

>>> while 2 in x : x.remove(2)

Ответ 6

Все ответы выше (кроме Мартина Андерсона) создают новый список без нужных элементов, а не удаляют элементы из исходного списка.

>>> 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 - 50ms

Итак, цикл .remove примерно на 100x медленнее........ Хм, может быть, нужен другой подход. Самый быстрый, который я нашел, - это использование списка, но затем замените содержимое исходного списка.

>>> def removeall_replace(x, l):
....    t = [y for y in l if y != x]
....    del l[:]
....    l.extend(t)
  • removeall_replace() - 450us

Ответ 7

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

while 2 in x:   
    x.remove(2)

Ответ 8

За счет удобочитаемости я думаю, что эта версия немного быстрее, поскольку она не заставляет время пересматривать список, тем самым делая то же самое, что и в любом случае, удаление должно делать:

x = [1, 2, 3, 4, 2, 2, 3]
def remove_values_from_list(the_list, val):
    for i in range(the_list.count(val)):
        the_list.remove(val)

remove_values_from_list(x, 2)

print(x)

Ответ 9

Чтобы удалить все повторяющиеся вхождения и оставить одно в списке:

test = [1, 1, 2, 3]

newlist = list(set(test))

print newlist

[1, 2, 3]

Вот функция, которую я использовал для Project Euler:

def removeOccurrences(e):
  return list(set(e))

Ответ 10

Я считаю, что это, вероятно, быстрее, чем любой другой способ, если вам не нужен порядок списков, если вы позаботились о конечном порядке, сохраните индексы из оригинала и прибегайте к этому.

category_ids.sort()
ones_last_index = category_ids.count('1')
del category_ids[0:ones_last_index]

Ответ 11

Подход Nump и тайминги к списку/массиву с 1.000.000 элементами:

Тайминги:

In [10]: a.shape
Out[10]: (1000000,)

In [13]: len(lst)
Out[13]: 1000000

In [18]: %timeit a[a != 2]
100 loops, best of 3: 2.94 ms per loop

In [19]: %timeit [x for x in lst if x != 2]
10 loops, best of 3: 79.7 ms per loop

Заключение: numpy в 27 раз быстрее (на моем ноутбуке) по сравнению с подходом к пониманию списка

PS, если вы хотите преобразовать свой обычный список Python lst в массив numpy:

arr = np.array(lst)

Настройка:

import numpy as np
a = np.random.randint(0, 1000, 10**6)

In [10]: a.shape
Out[10]: (1000000,)

In [12]: lst = a.tolist()

In [13]: len(lst)
Out[13]: 1000000

Check:

In [14]: a[a != 2].shape
Out[14]: (998949,)

In [15]: len([x for x in lst if x != 2])
Out[15]: 998949

Ответ 12

a = [1, 2, 2, 3, 1]
to_remove = 1
a = [i for i in a if i != to_remove]
print(a)

Возможно, не самый питонический, но все же самый легкий для меня, ха-ха

Ответ 13

Удалите все вхождения значения из списка Python

lists = [6.9,7,8.9,3,5,4.9,1,2.9,7,9,12.9,10.9,11,7]
def remove_values_from_list():
    for list in lists:
      if(list!=7):
         print(list)
remove_values_from_list()

Результат: 6.9 8.9 3 5 4.9 1 2.9 9 12.9 10.9 11

С другой стороны,

lists = [6.9,7,8.9,3,5,4.9,1,2.9,7,9,12.9,10.9,11,7]
def remove_values_from_list(remove):
    for list in lists:
      if(list!=remove):
        print(list)
remove_values_from_list(7)

Результат: 6.9 8.9 3 5 4.9 1 2.9 9 12.9 10.9 11

Ответ 14

for i in range(a.count(' ')):
    a.remove(' ')

Намного проще.

Ответ 15

Изменяет ли это список?

>>> x=[1,2,3,4,5,6,7,8]
>>> x
[1, 2, 3, 4, 5, 6, 7, 8]
>>> x = [val for val in x if val not in [2,3,4]]
>>> x
[1, 5, 6, 7, 8]

Ответ 16

Первое решение, используя фильтр.
Второе решение, используя понимание списка.

#If we want to remove all 2.
ls = [2, 2, 3, 4, 5, 6, 7, 8, 2, 3, 4, 6, 2]

# 1-filter takes two arguments(condition,sequence)
   ls = list(filter(lambda x: x != 2, ls))

# 2-list comprehension
   ls = [x for x in ls if x != 2]

Ответ 17

test = [1, 1, 2, 3, 2, 2, 2]
newlist = list(set(test)).remove(2) #get the unique and remove it 

>>> [1, 3]

Ответ 18

Что не так:

Motor = ['1', '2', '2'] Для я в двигателе: Если i! = '2': Печать (i) Печать (двигатель)

Использование анаконды

Ответ 19

Если у вас нет встроенного filter или вы не хотите использовать дополнительное пространство, вам нужно линейное решение...

def remove_all(A, v):
    k = 0
    n = len(A)
    for i in range(n):
        if A[i] !=  v:
            A[k] = A[i]
            k += 1

    A = A[:k]

Ответ 20

hello =  ['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']
#chech every item for a match
for item in range(len(hello)-1):
     if hello[item] == ' ': 
#if there is a match, rebuild the list with the list before the item + the list after the item
         hello = hello[:item] + hello [item + 1:]
print hello

['Привет, мир']

Ответ 21

Позволять

>>> x = [1, 2, 3, 4, 2, 2, 3]

Самое простое и эффективное решение, которое уже было опубликовано ранее:

>>> x[:] = [v for v in x if v != 2]
>>> x
[1, 3, 4, 3]

Другая возможность, которая должна использовать меньше памяти, но медленнее,

>>> for i in range(len(x) - 1, -1, -1):
        if x[i] == 2:
            x.pop(i)  # takes time ~ len(x) - i
>>> x
[1, 3, 4, 3]

Результаты синхронизации для списков длиной 1000 и 100000 с 10% совпадающими записями: 0,16 против 0,25 мс и 23 против 123 мс.

Timing with length 1000

Timing with length 100000

Ответ 22

myList = [1, 2, 4, 4, 1, 4, 2, 6, 9] newList = [] для числа в myList: если число не в newList: newList.append(number) myList = newList [:]

печать (MyList)

Ответ 23

Я просто сделал это для списка. Я просто новичок. Немного более продвинутый программист наверняка может написать такую функцию.

for i in range(len(spam)):
    spam.remove('cat')
    if 'cat' not in spam:
         print('All instances of ' + 'cat ' + 'have been removed')
         break

Ответ 24

О скорости!

import time
s_time = time.time()

print 'start'
a = range(100000000)
del a[:]
print 'finished in %0.2f' % (time.time() - s_time)
# start
# finished in 3.25

s_time = time.time()
print 'start'
a = range(100000000)
a = []
print 'finished in %0.2f' % (time.time() - s_time)
# start
# finished in 2.11

Ответ 25

X = [1,2,3,4,5,6,7,8,9,0]
print(X)
[1,2,3,4,5,6,7,8,9,0]
del X[:] 
print(X)
[] 

Ответ 26

p=[2,3,4,4,4]
p.clear()
print(p)
[]

Только с Python 3