Рубрики
Без рубрики

Python: Проверка индекса элемента в списке

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

Автор оригинала: 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 когда элемент не найден в списке.