У цій інструкції ви навчитеся знаходити позицію елемента у списку 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!