Должен ли я вызывать ValueError в Python

У меня есть такой код:

chars = #some list

try:
    indx = chars.index(chars)
except ValueError:
    #doSomething
else:
   #doSomethingElse

Я хочу иметь возможность сделать это, потому что мне не нравится сознательно вызывать исключения:

chars = #some list

indx = chars.index(chars)

if indx == -1:
    #doSomething
else:
   #doSomethingElse

Как я могу это сделать?

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

Brian 25.09.2008 11:29

Если вам нужен эффективный код, лучше научиться получать удовольствие от исключений, чем беспокоиться о «сознательном возникновении исключений». Исключения и их причина - неотъемлемая часть Python.

Thomas Wouters 25.09.2008 14:17
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
4
2
3 021
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

if element in mylist:
    index = mylist.index(element)
    # ... do something
else:
    # ... do something else

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

Thomas 25.09.2008 08:48
Ответ принят как подходящий

Обратите внимание, что последний подход противоречит общепринятой «питонической» философии EAFP, или «Проще просить прощения, чем разрешения»., тогда как первый следует ей.

Какой способ быстрее? Или это неактуальный вопрос? Должен ли я использовать C? ;)

jjnguy 25.09.2008 08:53

@jinguy: не беспокойтесь о скорости. Просто напишите код, который легко читается. Если вам нужна лучшая производительность, запустите его через профиль - скорее всего, медленная часть не связана с обработкой исключений.

John Millikin 25.09.2008 08:58

@jinguy, как правило, EAFP имеет лучшую производительность в случае отсутствия ошибок, что происходит чаще (в большинстве случаев :), чем в случае ошибки. YMMV в зависимости от деталей.

Kevin Little 25.09.2008 09:03

В конкретном случае, когда ваш список представляет собой последовательность односимвольных строк, вы можете получить то, что хотите, заранее изменив список для поиска на строку (например, '' .join (chars)).

Затем вы можете использовать метод .find (), который работает так, как вы хотите. Однако для списков или кортежей нет соответствующего метода.

Другой возможный вариант - использовать вместо него словарь. например.

d = dict((x, loc) for (loc,x) in enumerate(chars))
...
index = d.get(chars_to_find, -1)  # Second argument is default if not found.

Это также может работать лучше, если вы выполняете много поисков по списку. Однако, если это всего лишь один поиск в одноразовом списке, этого делать не стоит.

Другие вопросы по теме