>>> ["foo", "bar", "baz"].index("bar")
1
Ссылка: Структуры данных> Больше в списках
Предостережения следуют
Обратите внимание, что, хотя это, пожалуй, самый простой способ ответить на вопрос в ответ на вопрос , index
является довольно слабым компонентом list
API, и я не могу вспомнить, когда в последний раз я использовал его в гневе. Мне было отмечено в комментариях, что, поскольку на этот ответ часто ссылаются, его следует сделать более полным. Некоторые предостережения о list.index
следуют. Вероятно, стоит сначала взглянуть на строку документации:
>>> print(list.index.__doc__)
L.index(value, [start, [stop]]) -> integer -- return first index of value.
Raises ValueError if the value is not present.
Линейная сложность по времени в длине списка
Вызов index
проверяет каждый элемент списка по порядку, пока не найдет совпадение. Если ваш список длинный и вы не знаете, где именно он находится, этот поиск может стать узким местом. В этом случае вы должны рассмотреть другую структуру данных. Обратите внимание, что если вы точно знаете, где найти соответствие, вы можете дать подсказку index
. Например, в этом фрагменте l.index(999_999, 999_990, 1_000_000)
примерно на пять порядков быстрее, чем прямой l.index(999_999)
, поскольку первый должен искать только 10 записей, а второй - миллион:
>>> import timeit
>>> timeit.timeit('l.index(999_999)', setup='l = list(range(0, 1_000_000))', number=1000)
9.356267921015387
>>> timeit.timeit('l.index(999_999, 999_990, 1_000_000)', setup='l = list(range(0, 1_000_000))', number=1000)
0.0004404920036904514
Возвращает только индекс первого совпадения своему аргументу
Вызов index
просматривает список по порядку, пока не найдет совпадение, и останавливается на этом. Если вы ожидаете, что нужны индексы большего числа совпадений, вам следует использовать понимание списка или генератор выражение.
>>> [1, 1].index(1)
0
>>> [i for i, e in enumerate([1, 2, 1]) if e == 1]
[0, 2]
>>> g = (i for i, e in enumerate([1, 2, 1]) if e == 1)
>>> next(g)
0
>>> next(g)
2
В большинстве мест, где я когда-то использовал бы index
, сейчас я использую списочное понимание или генераторное выражение, потому что они более обобщаемы. Так что, если вы планируете достичь index
, взгляните на эти отличные возможности Python.
Выдает, если элемент отсутствует в списке
Вызов index
приводит к ValueError
, если элемент отсутствует.
>>> [1, 1].index(2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: 2 is not in list
Если элемент может отсутствовать в списке, вы должны либо
- Сначала проверьте его с помощью
item in my_list
(чистый, читаемый подход) или
- Обернуть вызов
index
в блок try/except
, который перехватывает ValueError
(возможно, быстрее, по крайней мере, когда список для поиска длинный и элемент обычно присутствует.)