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

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

Вступление

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

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

Использование функции 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 когда элемент не найден в списке.

comments powered by Disqus