В Python remove()
удалит первое вхождение значения в списке.
Как удалить все вхождения значения из списка?
Вот что я имею в виду:
>>> remove_values_from_list([1, 2, 3, 4, 2, 2, 3], 2)
[1, 3, 4, 3]
Функциональный подход:
Python 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]
Python 2.x
>>> x = [1,2,3,2,2,2,3,4]
>>> filter(lambda a: a != 2, x)
[1, 3, 3, 4]
[y for y in x if y != 2]
__ne__
. Сравнение двух значений - гораздо более сложный процесс, чем просто вызов__eq__
или__ne__
одно из них. Здесь это может работать правильно, потому что вы сравниваете только цифры, но в общем случае это неверно и является ошибкой.Вы можете использовать понимание списка:
источник
in
оператор иremove
метод сканируют весь список (до тех пор, пока они не найдут совпадение), так что в итоге вы сканируете список несколько раз таким образом.Вы можете использовать назначение срезов, если необходимо изменить исходный список, но при этом использовать эффективное понимание списка (или выражение генератора).
источник
x = [ v for v in x if x != 2 ]
предложений, которые создают новый список и изменяют x, чтобы ссылаться на него, оставляя исходный список нетронутым.Повторим решение первого поста более абстрактно:
источник
x = [1] * 10000 + [2] * 1000
. Тело цикла выполняется 1000 раз, и .remove () должен пропускать 10000 элементов при каждом вызове. Это пахнет O (n * n) для меня, но это не доказательство. Я думаю, что доказательством было бы предположить, что число 2 в списке пропорционально его длине. Этот коэффициент пропорциональности затем исчезает в обозначении big-O. В лучшем случае, если в списке только постоянное число 2, это не O (n ^ 2), а O (2n), то есть O (n).Смотрите простое решение
Это вернет список, содержащий все элементы
x
без2
источник
Все ответы выше (кроме Мартина Андерссона) создают новый список без нужных элементов, а не удаляют элементы из исходного списка.
Это может быть важно, если у вас есть другие ссылки на список.
Чтобы изменить список на месте, используйте метод, подобный этому
Что касается скорости, результаты на моем ноутбуке таковы (все в списке из 5000 записей с удалением 1000 записей)
Так что цикл .remove примерно в 100 раз медленнее ... Хм, может быть, нужен другой подход. Самое быстрое, что я нашел, это использование понимания списка, но затем заменим содержимое исходного списка.
источник
def remove_all(x, l): return [y for y in l if y != x]
затемl = remove_all(3,l)
ты можешь сделать это
источник
Ценой читабельности, я думаю, что эта версия немного быстрее, так как она не заставляет время пересматривать список, таким образом, выполняя точно такую же работу, что и удаление в любом случае:
источник
Подход и временная привязка к списку / массиву с 1.000.000 элементов:
Тайминги:
Вывод: NumPy в 27 раз быстрее (на моем ноутбуке) по сравнению с подходом к списку
PS, если вы хотите преобразовать свой обычный список Python
lst
в массив numpy:Настроить:
Проверьте:
источник
источник
Чтобы удалить все повторяющиеся вхождения и оставить их в списке:
Вот функция, которую я использовал для Project Euler:
источник
Я считаю, что это, вероятно, быстрее, чем любой другой способ, если вас не заботит порядок списков, если вы действительно заботитесь об окончательном порядке, сохраняйте индексы из оригинала и прибегайте к этому.
источник
Гораздо проще, я верю.
источник
Позволять
Самое простое и эффективное решение, которое уже было опубликовано ранее:
Другая возможность, которая должна использовать меньше памяти, но медленнее,
Результаты синхронизации для списков длиной 1000 и 100000 с 10% совпадающими записями: 0,16 против 0,25 мс и 23 против 123 мс.
источник
Удалить все вхождения значения из списка Python
Результат:
6.9 8.9 3 5 4.9 1 2.9 9 12.9 10.9 11
С другой стороны,
Результат:
6.9 8.9 3 5 4.9 1 2.9 9 12.9 10.9 11
источник
Если у вас нет встроенного
filter
или вы не хотите использовать дополнительное пространство, и вам нужно линейное решение ...источник
['Привет мир']
источник
Я просто сделал это для списка. Я просто новичок. Немного более продвинутый программист наверняка может написать такую функцию.
источник
Мы также можем сделать на месте удалить все , используя либо
del
илиpop
:Теперь для эффективности:
Как мы видим, версия на месте
remove_values_from_list()
не требует дополнительной памяти, но для ее запуска требуется гораздо больше времени:источник
Никто не опубликовал оптимальный ответ для сложности времени и пространства, поэтому я решил дать ему шанс. Вот решение, которое удаляет все вхождения определенного значения, не создавая новый массив и эффективно затрачивая время. Недостатком является то, что элементы не поддерживают порядок .
Временная сложность: O (n)
Дополнительная сложность пространства: O (1)
источник
О скорости!
источник
Только с Python 3
источник
Что случилось с:
Использование анаконды
источник