Удалить все вхождения значения из списка? - PullRequest
305 голосов
/ 21 июля 2009

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

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

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

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

Ответы [ 21 ]

2 голосов
/ 04 июня 2016

Подход Numpy и тайминг против списка / массива с 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

Проверка:

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

In [15]: len([x for x in lst if x != 2])
Out[15]: 998949
2 голосов
/ 29 июня 2018
a = [1, 2, 2, 3, 1]
to_remove = 1
a = [i for i in a if i != to_remove]
print(a)

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

1 голос
/ 30 июля 2018

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

#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]
1 голос
/ 03 ноября 2016
for i in range(a.count(' ')):
    a.remove(' ')

Гораздо проще, я верю.

1 голос
/ 31 марта 2016

Удалить все вхождения значения из списка 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

0 голосов
/ 02 мая 2019

Пусть

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

0 голосов
/ 01 марта 2019
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

['h', 'e', ​​'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd']

0 голосов
/ 12 августа 2018

Если у вас нет встроенного 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]
0 голосов
/ 25 апреля 2018

Что не так с:

Мотор = [ '1', '2', '2'] Для меня в Мотор: Если я! = '2': Печать (я) Печать (двигатель)

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

0 голосов
/ 04 мая 2017

О скорости!

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...