Как я могу игнорировать ValueError, когда пытаюсь удалить элемент из списка? - PullRequest
34 голосов
/ 29 марта 2012

Как я могу игнорировать сообщение об ошибке «нет в списке», если я звоню a.remove(x), когда x отсутствует в списке a?

Это моя ситуация:

>>> a = range(10)
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> a.remove(10)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: list.remove(x): x not in list
>>> a.remove(9)

Ответы [ 4 ]

37 голосов
/ 29 марта 2012

Хороший и потокобезопасный способ сделать это - просто попробовать и проигнорировать исключение:

try:
    a.remove(10)
except ValueError:
    pass  # do nothing!
25 голосов
/ 29 марта 2012

Я бы лично подумал об использовании set вместо list, если порядок ваших элементов не обязательно важен.Тогда вы можете использовать метод сброса:

>>> S = set(range(10))
>>> S
set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> S.remove(10)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 10
>>> S.discard(10)
>>> S
set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
16 голосов
/ 20 октября 2015

Как альтернатива игнорированию ошибки ValueError

try:
    a.remove(10)
except ValueError:
    pass  # do nothing!

Я думаю, что следующее немного более просто и читабельно:

if 10 in a:
    a.remove(10)
0 голосов
/ 08 мая 2019

Лучшим способом сделать это было бы

source_list = list(filter(lambda x: x != element_to_remove,source_list))

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

...