Вступление
Списки полезны по-разному по сравнению с другими типами данных из-за их универсальности. В этой статье мы рассмотрим одну из самых распространенных операций со списками - поиск индекса элемента.
Мы рассмотрим различные сценарии поиска элемента, то есть поиск первого, последнего и всех вхождений элемента. А также что происходит, когда искомого элемента не существует.
Использование функции index ()
Все операции, упомянутые в предыдущем абзаце, можно выполнить с помощью
встроенной функции index()
Синтаксис этой функции -
index(element[, start[, end]])
.
Параметр element
естественно представляет искомый элемент. Параметры
start
и end
являются обязательными и представляют диапазон индексов,
в котором мы ищем element
.
Значение по умолчанию для start
- 0
(поиск с начала), а значение по
умолчанию для end
- это количество элементов в списке (поиск до конца
списка).
Функция возвращает первую позицию element
в списке, который она могла
найти, независимо от того, сколько равных элементов осталось после
первого вхождения.
Поиск первого появления элемента
Использование функции index()
без установки каких-либо значений для
start
и end
даст нам первое вхождение искомого element
:
my_list = ['a', 'b', 'c', 'd', 'e', '1', '2', '3', 'b']
first_occurrence = my_list.index('b')
print("First occurrence of 'b' in the list: ", first_occurrence)
Что даст нам ожидаемый результат:
First occurrence of 'b' in the list: 1
Поиск всех вхождений элемента
Чтобы найти все вхождения элемента, мы можем использовать необязательный
параметр start
чтобы мы выполняли поиск только в определенных
сегментах списка.
Например, предположим, что мы будем первым вхождением элемента с
индексом 3
. Чтобы найти следующий, нам нужно будет продолжить поиск
первого появления этого элемента после индекса 3
. Мы будем повторять
этот процесс, меняя место начала поиска, пока мы найдем новые вхождения
элемента:
my_list = ['b', 'a', 2, 'n', False, 'a', 'n', 'a']
all_occurrences = []
last_found_index = -1
element_found = True
while element_found:
try:
last_found_index = my_list.index('a', last_found_index + 1)
all_occurrences.append(last_found_index)
except ValueError:
element_found = False
if len(all_occurrences) == 0:
print("The element wasn't found in the list")
else:
print("The element was found at: " + str(all_occurrences))
Запуск этого кода даст нам:
The element was found at: [1, 5, 7]
Здесь нам пришлось использовать try
, поскольку index()
выдает
ошибку, когда не может найти указанный element
в заданном диапазоне.
Это может быть необычным для разработчиков, которые больше привыкли к
другим языкам, поскольку такие функции обычно возвращают -1
/ null
когда элемент не может быть найден.
Однако в Python мы должны быть осторожны и использовать try
при
использовании этой функции.
Другой, более изящный способ сделать то же самое - использовать
понимание списка и полностью игнорировать функцию index()
my_list = ['b', 'a', 2, 'n', False, 'a', 'n', 'a']
all_occurrences = [index for index, element in enumerate(my_list) if element == 'a']
print("The element was found at: " + str(all_occurrences))
Что даст нам тот же результат, что и раньше. У этого подхода есть
дополнительное преимущество, заключающееся в том, что он не использует
блок try
Поиск последнего появления элемента
Если вам нужно найти последнее вхождение элемента в списке, есть два
подхода, которые вы можете использовать с функцией index()
- Переверните список и найдите первое вхождение в перевернутом списке
- Просмотрите все вхождения элемента и отслеживайте только последнее вхождение
Что касается первого подхода, если бы мы знали первое вхождение
element
в перевернутом списке, мы могли бы найти позицию последнего
вхождения в исходном. В частности, мы можем сделать это, вычтя
reversed_list_index - 1
из длины исходного списка:
my_list = ['b', 'a', 2, 'n', False, 'a', 'n', 'a']
reversed_list_index = my_list[::-1].index('n')
# or alteratively:
# reversed_list_index2 = list(reversed(my_list)).index('n')
original_list_index = len(my_list) - 1 - reversed_list_index
print(original_list_index)
Что даст нам желаемый результат:
6
Что касается второго подхода, мы могли бы настроить код, который мы использовали, чтобы найти все вхождения, и отслеживать только последнее обнаруженное вхождение:
my_list = ['b', 'a', 2, 'n', False, 'a', 'n', 'a']
last_occurrence = -1
element_found = True
while element_found:
try:
last_occurrence = my_list.index('n', last_occurrence + 1)
except ValueError:
element_found = False
if last_occurrence == -1:
print("The element wasn't found in the list")
else:
print("The last occurrence of the element is at: ", last_occurrence)
Что даст нам тот же результат:
6
Заключение
Мы рассмотрели некоторые из наиболее распространенных применений функции
index()
и способы ее избежать в некоторых случаях.
Помните о потенциально необычном поведении функции index()
, когда она
выдает ошибку вместо возврата -1
/ None
когда элемент не найден в
списке.