Убрать все вхождения значения из списка?
Проблема: Удаление всех вхождений значения из списка в Python
В Python метод remove()
удаляет только первое вхождение указанного значения в списке.
Как мне удалить все вхождения определенного значения из списка?
Вот что я имею в виду:
>>> remove_values_from_list([1, 2, 3, 4, 2, 2, 3], 2)
[1, 3, 4, 3]
Как мне реализовать такую функциональность?
5 ответ(ов)
Вы можете использовать функциональный подход для удаления всех вхождений определённого значения из списка в Python. Ниже приведены несколько способов сделать это для разных версий Python.
Python 3.x
Есть несколько вариантов:
- Используя функцию
filter()
и метод__ne__
:
>>> x = [1, 2, 3, 2, 2, 2, 3, 4]
>>> list(filter((2).__ne__, x))
[1, 3, 3, 4]
- С использованием
filter()
и анонимной функции (лямбда):
>>> x = [1, 2, 3, 2, 2, 2, 3, 4]
>>> list(filter(lambda a: a != 2, x))
[1, 3, 3, 4]
- Используя генератор списков:
>>> [i for i in x if i != 2]
[1, 3, 3, 4]
Python 2.x
В Python 2.x можно использовать filter()
с лямбда-функцией:
>>> x = [1, 2, 3, 2, 2, 2, 3, 4]
>>> filter(lambda a: a != 2, x)
[1, 3, 3, 4]
Каждый из этих методов эффективно удаляет все вхождения значения 2
из списка x
. Выберите тот, который вам кажется более удобным!
Вы можете использовать генератор списков для этой задачи. Вот пример кода:
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]
В этом примере функция remove_values_from_list
принимает два параметра: исходный список the_list
и значение val
, которое нужно удалить из списка. Мы создаем новый список, включая только те элементы, которые не равны val
, и возвращаем его.
Вы можете использовать присваивание по срезу, если необходимо изменить исходный список, при этом оставаясь при этом в рамках эффективного использования генератора. Вот пример:
>>> x = [1, 2, 3, 4, 2, 2, 3]
>>> x[:] = (value for value in x if value != 2)
>>> x
[1, 3, 4, 3]
В данном случае, мы используем генераторное выражение, чтобы отфильтровать элементы списка x
, и сразу же присваиваем результат обратно в x
, сохраняя измененный список.
В ответ на ваш вопрос можно предложить более абстрактный способ решения задачи, основанного на приведенном вами примере:
>>> x = [1, 2, 3, 4, 2, 2, 3]
>>> while 2 in x: x.remove(2)
>>> x
[1, 3, 4, 3]
В этом коде мы используем цикл while
, который проверяет, присутствует ли элемент 2
в списке x
. Если это так, то с помощью метода remove
мы удаляем первый найденный элемент 2
из списка. Этот процесс повторяется, пока все вхождения элемента 2
не будут удалены. В результате, после завершения цикла, список x
будет содержать только те элементы, которые не равны 2
.
Таким образом, можно сформулировать более общий подход к удалению всех вхождений определенного элемента из списка, используя цикл с условием для проверки наличия элемента.
Вы можете использовать следующий простой код для решения этой задачи:
>>> [i for i in x if i != 2]
Этот код создаст новый список, содержащий все элементы из x
, кроме значения 2
.
Как получить последний элемент списка?
Как клонировать список, чтобы он не изменялся неожиданно после присваивания?
Самый быстрый способ проверить наличие значения в списке
Преобразование всех строк в списке в целые числа
Нахождение среднего значения списка