У меня есть такой код:
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
Как я могу это сделать?
Если вам нужен эффективный код, лучше научиться получать удовольствие от исключений, чем беспокоиться о «сознательном возникновении исключений». Исключения и их причина - неотъемлемая часть Python.






if element in mylist:
index = mylist.index(element)
# ... do something
else:
# ... do something else
Конечно, это будет выполнять поиск по списку дважды, а для длинных списков асимптотически он будет в два раза медленнее ... Но я не знаю лучшего решения.
Обратите внимание, что последний подход противоречит общепринятой «питонической» философии EAFP, или «Проще просить прощения, чем разрешения»., тогда как первый следует ей.
Какой способ быстрее? Или это неактуальный вопрос? Должен ли я использовать C? ;)
@jinguy: не беспокойтесь о скорости. Просто напишите код, который легко читается. Если вам нужна лучшая производительность, запустите его через профиль - скорее всего, медленная часть не связана с обработкой исключений.
@jinguy, как правило, EAFP имеет лучшую производительность в случае отсутствия ошибок, что происходит чаще (в большинстве случаев :), чем в случае ошибки. YMMV в зависимости от деталей.
В конкретном случае, когда ваш список представляет собой последовательность односимвольных строк, вы можете получить то, что хотите, заранее изменив список для поиска на строку (например, '' .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.
Это также может работать лучше, если вы выполняете много поисков по списку. Однако, если это всего лишь один поиск в одноразовом списке, этого делать не стоит.
Примечание. Вы используете одно и то же имя переменной (символы) как для списка, который вы ищете, так и для элемента, который нужно найти. Один из них, вероятно, должен быть другим, если вы не ищете в списках со ссылками на себя, где они ссылаются на себя.