Автор оригинала: Guest Contributor.
Python: Проверка индекса элемента в списке
Вступление
Списки полезны по-разному по сравнению с другими типами данных из-за их универсальности. В этой статье мы рассмотрим одну из самых распространенных операций со списками – поиск индекса элемента.
Мы рассмотрим различные сценарии нахождения элемента, то есть нахождение первого, последнего и всех вхождений элемента. А также то, что происходит, когда элемент, который мы ищем, не существует.
Использование функции index()
Все операции, упомянутые в предыдущем абзаце, можно выполнить с помощью встроенной функции index ()
. Синтаксис этой функции – index(element[, start[, end]])
.
Параметр element
естественно представляет искомый элемент. Параметры start
и end
являются необязательными и представляют диапазон индексов, в которых мы ищем элемент .
Значение по умолчанию для start
равно 0
(поиск с самого начала), а значение по умолчанию для end
– это количество элементов в списке (поиск до конца списка).
Функция возвращает первую позицию элемента | в списке, которую она смогла найти, независимо от того, сколько равных элементов осталось после первого вхождения.
Нахождение первого вхождения элемента
Использование функции index()
без установки каких-либо значений для start
и end
даст нам первое вхождение элемента , который мы ищем:
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()
выдает ошибку, когда не может найти указанный элемент
в заданном диапазоне. Это может быть необычно для разработчиков, которые больше привыкли к другим языкам, поскольку такие функции обычно возвращаются -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()
:
- Переверните список и найдите первое вхождение в перевернутом списке
- Пройдите через все вхождения элемента и следите только за последним вхождением
Что касается первого подхода, то если бы мы знали первое вхождение элемента | в перевернутом списке, мы могли бы найти положение последнего вхождения в исходном. Более конкретно, мы можем сделать это, вычитая
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
когда элемент не найден в списке.