12

Как просто удалить элемент списка по значению?

8

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

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 ответ(ов)

2

Обычно Python выбрасывает исключение (Exception), если вы пытаетесь сделать что-то, что он не может выполнить. Поэтому вам нужно сделать одно из следующих действий:

if c in a:
    a.remove(c)

или:

try:
    a.remove(c)
except ValueError:
    pass

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

0

Вы можете сделать это следующим образом:

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, которое мы просто проигнорируем, что, в свою очередь, делает код более оптимальным.

0

Чтобы удалить все вхождения элемента из списка в 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 из списка.

0

Вот как можно реализовать удаление всех вхождений значения из последовательности "на месте" (без использования списковых включений):

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, удаляя из него все вхождения указанного значения.

0

Если вы знаете, какое значение нужно удалить, вот простой способ (по крайней мере, насколько я могу судить):

a = [0, 1, 1, 0, 1, 2, 1, 3, 1, 4]
while a.count(1) > 0:
    a.remove(1)

В результате вы получите:
[0, 0, 2, 3, 4]

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь