Метод index() в Python

Простой поиск элемента по значению

Метод index() в Python

Сегодня с примерами разбираемся, как применяется в языке Python метод index. Это функция, которую можно вызвать одной командой и попросить вернуть номер первого подходящего значения из набора пронумерованных элементов.

В реальной жизни index может помочь найти начало ошибок на сервере, старт падения акций на рынке, самый быстро раскупаемый товар на складе и другие полезные вещи.

Введение в метод index()

Для лучшего понимания сначала разберём, с какими объектами языка применяется index().

В языке Python index() работает с коллекциями упорядоченных элементов. Вот что нужно вспомнить про это:

  • Коллекция — структурированный набор данных. Это значит, что одна коллекция может хранить несколько элементов одного типа или разных.
  • Упорядоченная коллекция элементов присваивает каждому элементу внутри себя номер, начиная с 0. В Python к таким коллекциям относятся списки, кортежи и строки.

Списки имеют квадратные скобки, элементы внутри них изменяемы и перечисляются через запятую: numbers = [10, 20, 30, 40, 30]

Кортежи находятся в круглых скобках, а ещё их элементы нельзя изменять. В остальном выглядят так же: words = ("position", "returns", "item", "first").

Строка — это текст в одинарных или двойных кавычках: text = "Привет, мир!" 

Если использовать с любой из этих коллекций index() и указать в скобках элемент, который мы ищем, Python вернёт номер этого элемента или выдаст ошибку Value Error, если такого элемента нет.

Index() может применяться и с другими, более сложными последовательностями, но эти три — основные.

Синтаксис метода index()

Метод умеет принимать на вход 3 аргумента в скобках. Один из них обязательный, а остальные два используются при необходимости. Общий вид синтаксиса выглядит так:

collection.index(element, start, end)

Что есть что в этой строке:

  • collection — список, кортеж или строка.
  • index — команда для вызова метода index().
  • element — элемент, который мы хотим попробовать найти в коллекции. Это обязательный параметр.
  • start — необязательный параметр. Он указывает начало диапазона внутри коллекции, с которого надо начинать поиск. Например, если указать 2, то Питон будет искать нужный нам элемент, начиная с третьего в списке.
  • end — второй необязательный аргумент, обозначает конец диапазона. Если указать только один необязательный параметр, Python воспримет его как start и начнёт поиск с этого номера и до конца последовательности.

Пример синтаксиса

Сначала создадим коллекцию — список элементов-строк. В качестве значений возьмём названия аэропортов. Обратите внимание, что название «Марракеш-Менара» встречается в нём дважды:

# создаём список из строк
alphabets = ['Хамад', 'Сент-Экзюпери', 'Марракеш-Менара', "О'Хара", 'Дасин', 'Гейдар Алиев', 'Инчхон', 'Марракеш-Менара']

Теперь попробуем найти номер одного из них:

# ищем элемент Марракеш-Менара
index = alphabets.index('Марракеш-Менара')
print('Индекс Марракеш-Менара:', index)

Запускаем код и получаем номер первого совпадения в списке:

Индекс первого совпадения с Марракеш-Менара: 2

Пример с диапазоном

Теперь посмотрим, как выглядит работа с необязательными параметрами.

Сначала попробуем найти тот же аэропорт, но пропустив его первое упоминание в списке. Для этого начнём поиск с индекса 3:

# ищем элемент Марракеш-Менара, начиная с 4-го элемента
index = alphabets.index('Марракеш-Менара', 3)
print("Индекс второго совпадения с Марракеш-Менара:", index)

Программа находит первое вхождение в список, при этом не учитывает первые четыре элемента:

Индекс второго совпадения с Марракеш-Менара: 7

Теперь ограничим поиск до определённой области так, что искомого элемента внутри этого диапазона нет:

# ищем элемент Гейдар Алиев в диапазоне от 2-го до 5-го элементов
index = alphabets.index('Гейдар Алиев', 1, 4)
print('Индекс Гейдар Алиев:', index)

Хотя нужная строка есть в остальной части списка, для Python это неважно, он выдаёт ошибку ValueError:

ValueError: 'Гейдар Алиев' is not in list

Параметры метода index()

В документации параметры index описаны довольно неочевидно и могут запутать:

list.index(x[, start[, end]])

Такой вид описания — стандарт документации Python, который позволяет сделать описания компактными и удобными.

Как это расшифровывается:

  • Аргументы без скобок — обязательные. У index() такой аргумент только один — искомый элемент. В документации это x.
  • Аргументы в [] — необязательные. В первых квадратных скобках находится параметр start.
  • Вложенные [] — означают, что второй необязательный аргумент можно передать, только если передан первый. Во вложенных скобках у index() есть параметр end.

Получается, что для метода index Python допускает использовать в квадратных скобках два аргумента — позиции начала и конца для диапазона поиска. Но второй аргумент, конец диапазона, можно передать, только если до него уже передан индекс начала.

Возвращаемое значение метода index()

Метод будет возвращать индекс первого вхождения элемента. Если указанный элемент не найден, возвращается ошибка ValueError.

Применим метод на строке:

# строка с повторяющимися буквами 
string = "программирование" 

# ищем индекс буквы "а" 
a_index = string.index("а") 

# смотрим результат
print(a_index)

Мы ищем букву «а», и в слове «программирование» их две. Код находит первую, которая стоит на 6-й позиции:

5

Обработка исключений

Когда ошибка — часть естественной логики работы программы, в Python можно задействовать механизм try-except. В чём его смысл:

  • Мы говорим программе попытаться выполнить блок кода.
  • Заранее предупреждаем, что возможно появление определённой ошибки.
  • Прописываем наши действия при появлении такой ошибки.

Что это даёт: при получении ошибки программа не останавливается, а продолжает работу. При этом не нужно применять try-except вообще везде, потому что так можно пропустить непредвиденные баги, которые нужно исправлять.

В случае с index() мы знаем, что возможно появление ValueError. К тому же нам может быть необязательно останавливать работу программы, если искомого элемента нет в коллекции, поэтому в этом случае можно применить try-except.

Пример с обработкой исключений и диапазоном

Для тренировки создадим такой небольшой список:

# список языков программирования
languages = ["Python", "Java", "C++"]

Теперь попробуем найти язык, которого в списке нет. Сразу объясняем, что если элемент в списке отсутствует, то нужно вывести соответствующее сообщение:

# пробуем найти индекс "JavaScript"
try:
   # ищем "JavaScript" в списке
   js_index = languages.index("JavaScript")
   print(js_index)
except ValueError:
   # если элемента нет, выводим сообщение
   print("Такого языка нет в списке")

Запускаем код и получаем заготовленную логику:

Такого языка нет в списке

Теперь добавим логику по поиску существующей в списке строки, но искать её будем в неподходящем диапазоне:

# попробуем найти Java в промежутке от 3-го до 4-го номера
try:
   # ищем "Java" между индексами 2 и 3
   java_index = languages.index("Java", 2, 3)
   print(java_index)
except ValueError:
   # если не найден
   print("Java не найден в указанном диапазоне")

Результат в консоли:

Java не найден в указанном диапазоне

Преимущества и недостатки метода index()

У этой функции есть свои плюсы и минусы.

Что хорошо:

  • Метод простой и читаемый. Передаёте элемент — получаете позицию.
  • Встроенный и работает без дополнительных библиотек.
  • Поддерживает диапазоны и даёт возможность искать элемент только в конкретном промежутке.

Что не очень хорошо:

  • Вызывает ошибку, если не находит запрашиваемый элемент. Чтобы программа работала корректно, код приходится усложнять и добавлять конструкцию try-except.
  • Возвращает только первое вхождение. Если нужны все совпадения, нужно добавить обход элементов циклом.
  • Не работает для сложных условий, например «Найти первый элемент-строку, который начинается на букву „в“».

Сравнение с альтернативными методами

В Python есть ещё два метода, работа которых похожа на index().

Использование функции enumerate

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

Например, так можно найти индекс первого элемента, который начинается на букву «в»:

# создаём список
fruits = ["яблоко", "банан", "вишня", "арбуз"]

# ищем индекс первого элемента, который начинается на "в"
for index, fruit in enumerate(fruits):
   # как только находим такую строку...
   if fruit.startswith("в"):
       # выводим индекс на экран
       print(index)
       # и останавливаем цикл
       break

Получаем индекс строки «вишня»:

2

В чём enumerate() лучше, чем index():

  • Гибкий и подходит для сложных условий.
  • Не вызывает ошибку.

В чём хуже:

  • Устроен немного сложнее.

Использование list comprehension

Генератор списка, который создаёт список по заданному условию. Этот вариант применяют, если нужны все вхождения элементов, а не только первое.

Вот как это выглядит:

# создаём список
numbers = [10, 20, 30, 20, 40, 20] 

# находим все индексы числа 20 и добавляем их в список
indices = [i for i, num in enumerate(numbers) if num == 20] 

# выводим список на экран
print(indices)

Код выводит список с тремя номерами:

[1, 3, 5]

Плюсы этого варианта:

  • Код более компактный.
  • Умеет находить все совпадения.

Минусы:

  • Программа может быть менее читаемой.

Задачи по использованию метода index() для закрепления

Чтобы закрепить использование метода, решите несколько задач. Решение для каждой спрятано под спойлером после текста.

Задача 1: поиск элемента в списке

Есть список слов: ["find", "occurrence", "value", "specified", "python list index"]. Найдите индекс слова find и выведите его на экран.

# создаём список слов
cities = ["find", "occurrence", "value", "specified", "python list index"]

# ищем индекс "find"
find_index = cities.index("find")

# выводим результат
print(find_index)

Задача 2: поиск элемента с указанием диапазона

В списке чисел [5, 10, 15, 20, 25, 10, 30] нужно найти индекс числа 10, но только в диапазоне индексов между 3 и 6. Нужно предусмотреть обработку ошибки, если список вдруг поменяется и нужного числа там больше не будет.

# создаём список чисел
numbers = [5, 10, 15, 20, 25, 10, 30]

# ищем 10 между индексами 3 и 6
try:
   index_10 = numbers.index(10, 3, 6)
   # выводим найденный индекс на экран
   print(index_10)
# добавляем обработку ошибки
except ValueError:
   print("Число не найдено в указанном диапазоне.")

Задача 3: поиск элемента в строке

Возьмём строку с такой цитатой: «Программы должны писаться для людей, которые будут их читать». Найдите индекс первого вхождения в строку буквы «и».

# задаём строку
text = "Программы должны писаться для людей, которые будут их читать."

# ищем индекс первой "и"
first_i = text.index("и")

# выводим результат
print(first_i)

Задача 4: поиск подстроки

Подстрока — несколько символов подряд. Если строка — это предложение, то подстрока — слово, часть слова или несколько частей слова. Главное, что все символы в ней должны идти подряд.

Для задачи найдите подстроку-слово «исправить» в таком предложении: «Последние нововведения в C++ были созданы, чтобы исправить предыдущие нововведения».

# задаём строку
sentence = "Последние нововведения в C++ были созданы, чтобы исправить предыдущие нововведения"

# ищем начало слова "исправить"
power_index = sentence.index("исправить")

# выводим результат
print(power_index)

Вам слово

Приходите к нам в соцсети поделиться своим мнением о списках в Python и почитать, что пишут другие. А ещё там выходит дополнительный контент, которого нет на сайте: шпаргалки, опросы и разная дурка. В общем, вот тележка, вот ВК — велком!

Обложка:

Алексей Сухов

Корректор:

Елена Грицун

Вёрстка:

Мария Климентьева

Соцсети:

Юлия Зубарева

Получите ИТ-профессию
В «Яндекс Практикуме» можно стать разработчиком, тестировщиком, аналитиком и менеджером цифровых продуктов. Первая часть обучения всегда бесплатная, чтобы попробовать и найти то, что вам по душе. Дальше — программы трудоустройства.
Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию
А вы читали это?
easy