Как найти позицию элемента в списке Python

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

Эффективный способ: метод index()

Наиболее простой и прямой способ получить индекс элемента в списке Python - использовать встроенный метод list.index(x[, start[, end]]). Метод возвращает индекс первого вхождения указанного значения. Если элемент отсутствует, возникает исключение ValueError.


fruits = ["яблоко", "банан", "вишня", "банан"]
index = fruits.index("банан")
print(index)  # 1

получить индекс списка python (получение индекса элемента списка python)

Метод принимает необязательные параметры start и end, ограничивающие диапазон поиска. Это полезно для пропуска первых найденных элементов или для поиска в подсписке.


index = fruits.index("банан", 2)  # поиск начиная с индекса 2
print(index)  # 3

Типичная ошибка: ValueError

Если элемента нет в списке, метод index() вызовет исключение ValueError. Рекомендуется предварительно проверять наличие элемента оператором in или обрабатывать исключение блоком try/except.


if "груша" in fruits:
    print(fruits.index("груша"))
else:
    print("Элемент не найден")

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

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


fruits = ["яблоко", "банан", "вишня", "банан"]
indices = [i for i, val in enumerate(fruits) if val == "банан"]
print(indices)  # [1, 3]

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

Перебор всех элементов с помощью enumerate является линейным O(n), что оптимально, если нужно найти все вхождения. Однако если требуется только первое или одно из нескольких, лучше использовать next() с генератором.

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

Иногда нужно получить индекс элемента, удовлетворяющего определённому условию (например, объект с определённым атрибутом). Для этого применяется функция next() с генераторным выражением.


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

people = [Person("Анна"), Person("Борис"), Person("Виктор")]
index = next(i for i, p in enumerate(people) if p.name == "Борис")
print(index)  # 1

Ошибка: StopIteration

Если ни один элемент не удовлетворяет условию, генератор вызовет исключение StopIteration. Чтобы этого избежать, передайте значение по умолчанию в next().


index = next((i for i, p in enumerate(people) if p.name == "Григорий"), None)
print(index)  # None

Как получить индекс в отсортированном списке для бинарного поиска?

Для больших отсортированных списков эффективно использовать модуль bisect. Функция bisect_left() возвращает позицию, куда следует вставить элемент для сохранения порядка. Если элемент уже есть, возвращается индекс первого вхождения.


import bisect
sorted_nums = [10, 20, 30, 40, 50]
pos = bisect.bisect_left(sorted_nums, 30)
print(pos)  # 2
pos = bisect.bisect_left(sorted_nums, 35)
print(pos)  # 3 (позиция для вставки)

Важно: список должен быть отсортирован

Бинарный поиск работает корректно только на отсортированных данных. Использование на неотсортированном списке даст неверный результат.

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

Для числовых массивов часто применяется библиотека NumPy. Функция np.where() возвращает кортеж индексов, где условие истинно.


import numpy as np
arr = np.array([10, 20, 30, 20, 40])
indices = np.where(arr == 20)
print(indices)  # (array([1, 3]),)

Для одномерных массивов можно извлечь первый элемент: indices[0]. Для многомерных массивов возвращаются индексы по каждой оси.

Как получить индекс элемента в списке с помощью циклов (если нужен контроль)?

Иногда требуется дополнительная логика при поиске, например, пропуск определённых элементов. Тогда используется явный цикл с счётчиком.


numbers = [5, 8, 3, 8, 2]
target = 8
found_index = None
for i, num in enumerate(numbers):
    if num == target:
        found_index = i
        break
print(found_index)  # 1

Проблема: повторяющийся код

Для базового поиска лучше применять встроенный index(), так как он оптимизирован. Цикл полезен при нестандартных условиях.

Расширенные примеры получения индекса элемента списка

1. Метод index() с параметрами start и end

Параметры start и end позволяют ограничить область поиска. Это может быть полезно для нахождения второго вхождения без создания подсписка.

Пример

data = [1, 2, 3, 2, 4, 2, 5]
first = data.index(2)
second = data.index(2, first+1)
third = data.index(2, second+1)
print(f"Первый индекс: {first}")  # 1
print(f"Второй индекс: {second}") # 3
print(f"Третий индекс: {third}")  # 5
Первый индекс: 1
Второй индекс: 3
Третий индекс: 5

2. Поиск всех индексов с помощью list comprehension и enumerate

Классический способ получить список индексов для всех вхождений.

Пример

words = ["кот", "собака", "кот", "птица", "кот"]
indices = [idx for idx, w in enumerate(words) if w == "кот"]
print(indices)  # [0, 2, 4]
[0, 2, 4]

3. Использование next() с генератором для первого совпадения по условию

Эффективно, если нужно только первое вхождение и не требуется перебирать весь список.

Пример

numbers = [10, 20, 30, 40, 50, 20, 60]
first_20 = next((i for i, v in enumerate(numbers) if v == 20), None)
print(first_20)  # 1
first_100 = next((i for i, v in enumerate(numbers) if v == 100), "не найдено")
print(first_100)  # не найдено
1
не найдено

4. Бинарный поиск с bisect для отсортированного списка и вставка без дубликатов

Модуль bisect также позволяет найти левую и правую границы для дубликатов.

Пример

import bisect
sorted_list = [1, 3, 3, 3, 7, 9]
pos_left = bisect.bisect_left(sorted_list, 3)   # первый индекс 3
pos_right = bisect.bisect_right(sorted_list, 3) # индекс после последнего 3
print(f"Левый: {pos_left}, Правый: {pos_right}")  # Левый: 1, Правый: 4
# Вставка элемента 4
bisect.insort(sorted_list, 4)
print(sorted_list)  # [1, 3, 3, 3, 4, 7, 9]
Левый: 1, Правый: 4
[1, 3, 3, 3, 4, 7, 9]

5. Получение индексов для многомерного массива NumPy

np.where удобен для нахождения позиций элементов в матрице.

Пример

import numpy as np
arr = np.array([[10, 20, 30], [40, 50, 60], [70, 80, 90]])
indices = np.where(arr == 50)
print(indices)  # (array([1]), array([1]))
# Извлечение в виде кортежа координат
list(zip(indices[0], indices[1]))  # [(1, 1)]
(array([1]), array([1]))

6. Поиск индекса значения в Series pandas

Метод pandas Series имеет метод index.get_loc() для поиска по значению метки, но если нужен позиционный индекс, используется .tolist().index().

Пример

import pandas as pd
s = pd.Series([100, 200, 300, 200, 400])
# Получить позицию первого вхождения 200
pos = s.tolist().index(200)
print(pos)  # 1
# Для всех вхождений
positions = [i for i, v in enumerate(s) if v == 200]
print(positions)  # [1, 3]
1
[1, 3]

7. Ручной поиск с помощью while и обработка дубликатов с использованием default dict

Для сбора всех индексов по каждому уникальному значению можно применить collections.defaultdict.

Пример

from collections import defaultdict
data = ["a", "b", "a", "c", "b", "a"]
index_map = defaultdict(list)
for idx, val in enumerate(data):
    index_map[val].append(idx)
print(dict(index_map))
# {'a': [0, 2, 5], 'b': [1, 4], 'c': [3]}
{'a': [0, 2, 5], 'b': [1, 4], 'c': [3]}

Получение индекса элемента списка Python - comments

En
получить индекс списка python (python)