Поиск индекса элемента с помощью index в Python

Раздел: Основы Python -> Коллекции

Основы метода index()

Метод index() возвращает индекс первого вхождения указанного значения в списке, кортеже или строке. Синтаксис: коллекция.index(значение, [start, [stop]]). Параметры start и stop задают диапазон поиска (необязательно). Если элемент не найден, возникает исключение ValueError.


# Пример со списком
numbers = [10, 20, 30, 20, 40]
idx = numbers.index(20)
print(idx)  # 1 (первое вхождение)

# Строка
text = "Python"
pos = text.index('t')
print(pos)  # 2

# Кортеж
tuple_data = (1, 2, 3, 2)
pos = tuple_data.index(2)
print(pos)  # 1

Python set list (set и list в python: различия и использование)

Типичная ошибка: вызов index() для отсутствующего элемента приводит к ValueError. Например, [1,2].index(3) вызовет исключение. Решение: предварительно проверять наличие через in или использовать блок try/except.

Как найти индекс элемента с учётом диапазона поиска?

Метод index() принимает необязательные аргументы start и stop, ограничивающие участок коллекции для поиска. Это полезно для поиска второго или последующего вхождения.


items = ['a', 'b', 'c', 'b', 'd']
first_b = items.index('b')        # 1
second_b = items.index('b', 2)    # 3 (поиск начиная с индекса 2)
print(first_b, second_b)

Python пары значений (пары значений в python)

Если указать start больше длины коллекции или stop меньше start, возникнет ValueError или пустой результат. Всегда проверяйте границы.

Как избежать ValueError, когда элемента нет в коллекции?

Самый надёжный способ - проверить наличие элемента оператором in перед вызовом index().


my_list = [1, 2, 3]
value = 4
if value in my_list:
    idx = my_list.index(value)
else:
    print("Элемент не найден")

Python object get (метод get для объектов в python)

Альтернатива - перехват исключения:


try:
    idx = my_list.index(value)
    print(f"Индекс: {idx}")
except ValueError:
    print("Элемент отсутствует")

Python get keys (метод get для словарей в python)

Как получить все индексы вхождения элемента?

Метод index() возвращает только первый индекс. Для поиска всех вхождений используется цикл с изменяемым start или list comprehension.


# Цикл со сдвигом start
def find_all(lst, value):
    indices = []
    start = 0
    while True:
        try:
            idx = lst.index(value, start)
            indices.append(idx)
            start = idx + 1
        except ValueError:
            break
    return indices

print(find_all([1,2,3,2,4,2], 2))  # [1, 3, 5]

Get index python (метод index в python)


# Через enumerate и list comprehension
lst = [1,2,3,2,4,2]
indices = [i for i, x in enumerate(lst) if x == 2]
print(indices)  # [1, 3, 5]

Python get methods (методы get в python)

При использовании цикла с try/except важно не забывать обновлять start на idx+1, иначе возникнет бесконечный цикл.

Как найти индекс элемента по условию (первый подходящий)?

Для поиска индекса по произвольному условию удобно использовать функцию next() с генератором.


# Найти индекс первого положительного числа
data = [-5, 0, 3, -1, 7]
idx = next((i for i, x in enumerate(data) if x > 0), None)
print(idx)  # 2

Второй аргумент None - значение по умолчанию, если ни один элемент не удовлетворяет условию.

Если не указать значение по умолчанию, при отсутствии подходящего элемента возникнет исключение StopIteration.

- типы данных python кортеж (кортеж (tuple) в python)
- Python типы данных set (множество (set) в python)

Расширенные примеры использования метода index()

Поиск в строке с учетом регистра

Пример

text = "Python programming"
pos = text.index('p')  # 0, так как 'P' заглавная, 'p' строчная
print(pos)
# Если нужен регистронезависимый поиск:
pos_lower = text.lower().index('p')  # 0
print(pos_lower)
0
0

Поиск индекса с отрицательными start и stop

Пример

# Отрицательный start отсчитывается от конца
lst = [10, 20, 30, 40, 50]
idx = lst.index(30, -4, -1)  # start = -4 (индекс 1), end = -1 (индекс 4)
print(idx)  # 2

Важно: отрицательные индексы работают как в срезах. Если stop меньше start, поиск не даст результата.

Поиск в кортеже с дубликатами

Пример

t = (1, 2, 3, 2, 4, 2)
# Поиск третьего вхождения '2'
first = t.index(2)
second = t.index(2, first + 1)
third = t.index(2, second + 1)
print(first, second, third)  # 1 3 5

Поиск первого элемента, удовлетворяющего условию (через next и lambda)

Пример

# Найти индекс первого числа, большего 5
numbers = [1, 3, 7, 2, 9]
idx = next(i for i, val in enumerate(numbers) if val > 5)
print(idx)  # 2

Комбинирование index с map и filter

Пример

# Список строк, найти индекс первой строки, содержащей 'abc'
strings = ['xyz', 'abcd', 'defabc', 'ghi']
try:
    idx = next(i for i, s in enumerate(strings) if 'abc' in s)
    print(f"Индекс: {idx}")
except StopIteration:
    print("Нет подходящей строки")
# Результат: Индекс: 1

Поиск во вложенном списке (двумерном)

Пример

matrix = [[1,2], [3,4], [5,6]]
# Найти индекс строки, содержащей число 4
target = 4
for i, row in enumerate(matrix):
    try:
        col = row.index(target)
        print(f"Строка {i}, столбец {col}")
        break
    except ValueError:
        continue
# Вывод: Строка 1, столбец 1

Поиск индекса в списке объектов по атрибуту

Пример

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

people = [Person('Alice', 25), Person('Bob', 30), Person('Charlie', 35)]
# Найти индекс человека с именем 'Bob'
idx = next((i for i, p in enumerate(people) if p.name == 'Bob'), -1)
print(idx)  # 1

Метод index в Python - comments

En
Get index python (python)