Как просто удалить элемент списка по значению?
Я хочу удалить значение из списка, если оно существует в этом списке (хотя его там может и не быть).
a = [1, 2, 3, 4]
b = a.index(6)
del a[b]
print(a)
Вышеуказанный код приводит к ошибке:
ValueError: list.index(x): x not in list
Поэтому мне приходится делать так:
a = [1, 2, 3, 4]
try:
b = a.index(6)
del a[b]
except:
pass
print(a)
Но разве нет более простого способа сделать это?
5 ответ(ов)
Обычно Python выбрасывает исключение (Exception), если вы пытаетесь сделать что-то, что он не может выполнить. Поэтому вам нужно сделать одно из следующих действий:
if c in a:
a.remove(c)
или:
try:
a.remove(c)
except ValueError:
pass
Исключение не обязательно является чем-то плохим, если это то, что вы ожидаете, и если вы обрабатываете его должным образом.
Вы можете сделать это следующим образом:
a = [1, 2, 3, 4]
if 6 in a:
a.remove(6)
Но в этом случае значение 6 нужно будет искать в списке a
дважды, что неэффективно. Вместо этого вы можете использовать конструкцию try-except
, что будет быстрее:
try:
a.remove(6)
except ValueError:
pass
В таком варианте Python попытается удалить 6 из списка, и если она отсутствует, будет вызвано исключение ValueError
, которое мы просто проигнорируем, что, в свою очередь, делает код более оптимальным.
Чтобы удалить все вхождения элемента из списка в Python, вы можете воспользоваться функцией filter
. Например, у вас есть следующий список:
a = [1, 2, 2, 3, 4, 5]
Чтобы удалить всеOccurrences цифры 2
, вы можете использовать следующий код:
a = list(filter(lambda x: x != 2, a))
Этот код оставит все элементы списка, кроме тех, которые равны 2
.
Если же вам нужно удалить только одно вхождение элемента, вы можете воспользоваться методом remove()
:
a.remove(2)
Этот метод удалит только первое вхождение числа 2
из списка.
Вот как можно реализовать удаление всех вхождений значения из последовательности "на месте" (без использования списковых включений):
def remove_all(seq, value):
pos = 0
for item in seq:
if item != value:
seq[pos] = item
pos += 1
del seq[pos:]
Этот код перебирает все элементы последовательности seq
и сохраняет все значения, которые не равны value
, в начале той же последовательности. После завершения цикла все остаточные элементы (которые равны value
) удаляются с помощью del seq[pos:]
. Таким образом, функция изменяет исходный список seq
, удаляя из него все вхождения указанного значения.
Если вы знаете, какое значение нужно удалить, вот простой способ (по крайней мере, насколько я могу судить):
a = [0, 1, 1, 0, 1, 2, 1, 3, 1, 4]
while a.count(1) > 0:
a.remove(1)
В результате вы получите:
[0, 0, 2, 3, 4]
Почему используется string.join(list), а не list.join(string)?
Как клонировать список, чтобы он не изменялся неожиданно после присваивания?
Как вернуть ключи словаря в виде списка в Python?
Как отсортировать список/кортеж списков/кортежей по элементу на заданном индексе
Как преобразовать строковое представление списка в список?