Як знайти індекс елемента в списках Python

У цій інструкції ви навчитеся знаходити позицію елемента у списку Python, використовуючи як стандартні цикли, так і вбудовану функцію списку index().

Коли ви працюєте зі списками в Python, іноді вам потрібно визначити, на якій позиції знаходиться конкретний елемент. Для цього є два основні способи:

  • Переглянути список, порівнюючи кожен елемент з шуканим значенням.
  • Використати вбудовану функцію index() для списків.

У цій статті ми розглянемо обидва ці методи. Почнемо! 👩🏽‍💻

Знову про списки Python

У Python список – це впорядкована колекція елементів, які можуть бути одного або різних типів даних. Списки є змінними, тобто ви можете змінювати їх вміст без створення нового списку.

Розглянемо приклад списку фруктів, який складається з 5 різних видів.

fruits = ["яблуко","манго","полуниця","гранат","диня"]

Ви можете визначити довжину будь-якого об’єкта в Python за допомогою вбудованої функції len(). Викликавши функцію len() зі списком (фрукти) як аргументом, ви отримаєте його довжину, як показано нижче.

len(fruits)
# Результат: 5

У цьому прикладі ми будемо використовувати список фруктів для демонстрації.

Індексація у списках Python

У Python індексація починається з нуля. Це означає, що перший елемент будь-якого списку або ітератора має індекс 0, другий – 1 і так далі. Якщо довжина ітератора дорівнює k, то останній елемент має індекс k – 1.

Для отримання індексів під час циклу ітерацій ви можете використовувати функцію range().

Зауважте, що при переборі range(k) ви отримаєте індекси 0, 1, 2, …, (k-1). Тому, встановивши k = len(список), ви отримаєте список всіх дійсних індексів.

Наступний блок коду це демонструє.

for i in range(len(fruits)):
  print(f"i:{i}, fruit[{i}] is {fruits[i]}")

# Результат
i:0, fruit[0] is яблуко
i:1, fruit[1] is манго
i:2, fruit[2] is полуниця
i:3, fruit[3] is гранат
i:4, fruit[4] is диня

Тепер, коли ми ознайомилися з основами списків Python, розглянемо, як знайти індекс елемента у списку.

Пошук індексу елемента списку за допомогою циклу for

Використовуючи список фруктів з попереднього розділу, ми навчимося знаходити індекс заданого елемента за допомогою циклу for.

Використання циклу for та функції range()

Визначимо змінну `target` для значення, яке ми шукаємо у списку.

Використовуючи цикл for та функцію range(), ми отримаємо індекси від 0 до len(fruits) – 1.

  • Переглядаємо кожен індекс у списку фруктів.
  • Перевіряємо, чи елемент за поточним індексом `i` дорівнює цільовому.
  • Якщо умова виконується, виводимо повідомлення, що ціль знайдено за індексом `i`.
fruits = ["яблуко","манго","полуниця","гранат","диня"]

target = "манго"

for i in range(len(fruits)):
  if fruits[i] == target:
   print(f"{target} знайдено за індексом {i}")

# Результат
манго знайдено за індексом 1

У цьому прикладі рядок “манго” з’являється один раз (за індексом 1) у списку фруктів.

Однак, цільове значення іноді може зустрічатися кілька разів або не зустрічатися взагалі. Для обробки таких випадків змінимо вищенаведений цикл і перетворимо його у функцію find_in_list.

Пояснення визначення функції

Функція find_in_list приймає два параметри:

  • `target`: значення, яке ми шукаємо, і
  • `py_list`: список Python, в якому ми проводимо пошук.
def find_in_list(target,py_list):
  target_indices = []
  for i in range(len(fruits)):
    if fruits[i] == target:
      target_indices.append(i)  
  if target_indices == []:
    print("Вибачте, ціль не знайдено!")
  else:
    print(f"{target} знайдено за індексами {target_indices}")

У функції ми створюємо порожній список `target_indices`. Потім перебираємо список, перевіряючи кожен елемент. Якщо ціль знайдена, додаємо її індекс до списку `target_indices` за допомогою методу append().

Зверніть увагу, що `list.append(item)` додає елемент в кінець списку.

  • Якщо ціль не знайдена, `target_indices` залишається порожнім списком, і користувачеві виводиться відповідне повідомлення.
  • Якщо ціль знайдена кілька разів, `target_indices` міститиме всі її індекси.

Далі переозначимо список фруктів, як показано нижче.

Цього разу ми шукаємо рядок “манго”, який зустрічається двічі – за індексами 1 та 4.

fruits = ["яблуко","манго","полуниця","гранат","манго","диня"]
target = "манго"
find_in_list(target,fruits)

# Результат
манго знайдено за індексами [1, 4]

Викликаючи функцію find_in_list з параметрами target та fruits, ми бачимо, що повертаються обидва індекси.

target = "ріпа"
find_in_list(target,fruits)

# Результат
Вибачте, ціль не знайдено!

Якщо ви спробуєте знайти “ріпу”, якої немає у списку, отримаєте повідомлення про те, що ціль не знайдена.

Використання циклу for і функції enumerate()

У Python функція `enumerate()` дозволяє одночасно отримувати як індекс, так і елемент, без необхідності використовувати функцію `range()`.

Наступний приклад показує, як використовувати функцію `enumerate()` для отримання індексів та елементів.

fruits = ["яблуко","манго","полуниця","гранат","манго","диня"]
for index,fruit in enumerate(fruits):
  print(f"Індекс {index}: {fruit}")

# Результат
Індекс 0: яблуко
Індекс 1: манго
Індекс 2: полуниця
Індекс 3: гранат
Індекс 4: манго
Індекс 5: диня

Тепер перепишемо функцію Python для пошуку індексу елементів у списку за допомогою функції enumerate().

def find_in_list(target,py_list):
  target_indices = []
  for index, fruit in enumerate(fruits):
   if fruit == target:
    target_indices.append(index) 
  if target_indices == []:
    print("Вибачте, ціль не знайдено!")
  else:
    print(f"{target} знайдено за індексами {target_indices}")

Як і в попередньому розділі, тепер можна викликати функцію `find_in_list` з дійсними аргументами.

Визначення функції можна перетворити в еквівалентне включення списку, що ми й зробимо в наступному розділі.

Пошук індексу елемента списку за допомогою включення списку

Включення списків в Python дозволяє створювати нові списки на основі існуючих, використовуючи певні умови. Ось загальна структура:

new_list = [<результат> for <елементи існуючого ітератора> if <умова істинна>] 

На ілюстрації нижче показано, як визначити елементи включення списку. Використовуючи це, ви можете перетворити функцію `find_in_list` на включення списку.

Використовуючи вищезазначене, вираз включення списку для створення цільових індексів має вигляд:

target_indices = [index for index,fruit in enumerate(fruits) if fruit==target]

Як вправу, ви можете спробувати запустити наведений вище код для декількох інших прикладів.

Пошук індексу елемента списку за допомогою методу index()

Щоб знайти індекс елемента у списку Python, можна скористатися вбудованим методом `.index()`. Ось загальний синтаксис:

list.index(value,start,end)

Розбір наведеного вище методу:

  • `value` – цільове значення, яке ви шукаєте.
  • `start` та `end` – необов’язкові позиційні аргументи, які можна використовувати для пошуку індексу елемента у фрагменті списку, починаючи з `start` та закінчуючи `end` – 1.

Зверніть увагу, що метод `.index()` повертає лише індекс першого входження значення у списку. Навіть якщо ви шукаєте у фрагменті списку `[start:end-1]`, він все одно поверне лише індекс першого входження елемента.

Давайте розглянемо приклад, щоб зрозуміти, як працює метод `.index()`.

fruits = ["яблуко","манго","полуниця","гранат","манго","диня"]
target = "манго"

fruits.index(target)
1

Хоча в списку фруктів є два входження “манго”, ви бачите, що повернувся тільки індекс першого входження.

Щоб отримати індекс другого входження “манго”, можна здійснити пошук у фрагменті списку, починаючи з індексу 2 та закінчуючи індексом 5, як показано нижче.

fruits.index(target,2,5)
4

Як обробляти ValueErrors у Python

Розглянемо, що станеться, якщо ви спробуєте знайти індекс елемента, якого немає у списку, наприклад “морква”.

target = "морква"

fruits.index(target)

# Результат
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-17-81bd454e44f7> in <module>()
      1 target = "морква"
      2 
----> 3 fruits.index(target)

ValueError: 'морква' відсутня у списку

Як видно з коду вище, виникає помилка ValueError. У Python можна обробити цю помилку як виняток, використовуючи блоки `try` та `except`.

Загальний синтаксис використання `try-except` такий:

try:
  # код, який потрібно виконати
except <ТипПомилки>:
  # код для обробки винятку <ТипПомилки>

Використовуючи наведені вище блоки `try-except`, ми можемо обробити `ValueError` як виняток.

target = "морква"
try:
  fruits.index(target)
except ValueError:
  print(f"Вибачте, не вдалося знайти {target} у списку")

# Результат
Вибачте, не вдалося знайти морква у списку

Наведений вище код робить наступне:

  • Якщо ціль присутня у списку, він повертає індекс цілі.
  • Якщо ціль відсутня, він обробляє `ValueError` як виняток і виводить повідомлення про помилку.

Підсумок

Ось підсумок різних методів, які ви навчилися для пошуку індексу елемента у списку Python.

  • Ви можете використовувати цикли `for` та функцію `range()` для отримання елементів і їхніх індексів. Перевірте, чи елементи за індексами відповідають цілі.
  • Ви також можете використовувати функцію `enumerate()` для одночасного доступу до елемента та його індексу.
  • Обидва наведені вище методи можна використовувати у виразі включення списку.
  • Для пошуку індексу елемента у списку ви також можете скористатися вбудованим методом `.index()`.
  • `list.index(value)` повертає індекс першого входження значення у списку. Якщо значення відсутнє, виникає помилка `ValueError`.
  • Ви можете здійснювати пошук у певному фрагменті списку за допомогою `list.index(value, start, end)` для пошуку значення у фрагменті списку `[start:end-1]`.

Далі навчитеся сортувати словник Python за ключем або значенням. Щасливого програмування на Python!