DevGang
Авторизоваться

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

Списки полезны по-разному по сравнению с другими типами данных из-за их универсальности. В этой статье мы рассмотрим одну из самых распространенных операций со списками - поиск индекса элемента.

Мы рассмотрим различные сценарии поиска элемента, то есть нахождение первого, последнего и всех вхождений элемента. А также что происходит, когда искомого элемента не существует.

Использование Функции 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, чтобы мы выполняли поиск только в определенных сегментах списка.

Например, предположим, что первое вхождение элемента в index 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():

  1. Переверните список и найдите первое вхождение в перевернутом списке
  2. Просмотрите все вхождения элемента и отслеживайте только последнее вхождение

Что касается первого подхода, если бы мы знали первое вхождение 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, когда элемент не найден в списке.

#Python
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться

Присоединяйся в тусовку

Поделитесь своим опытом, расскажите о новом инструменте, библиотеке или фреймворке. Для этого не обязательно становится постоянным автором.

Попробовать

Оплатив хостинг 25$ в подарок вы получите 100$ на счет

Получить