Как вычислить индекс нужного объекта в структуре данных list

Раздел: Основы Python -> list

Поиск индекса в списке Python определяет позицию элемента по его значению. Индексы перечисляются слева направо начиная с нуля. Встроенный метод list.index дает самый короткий путь к номеру первой подходящей ячейки.

Варианты поиска по списку значений

Встроенный метод list.index

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

fruits = ['яблоко', 'банан', 'лимон', 'банан']
position = fruits.index('лимон')
print(position)

функция длина списка в python (длина списка в python)

2

Python ввод списка (ввод списка в python)

Если значение присутствует несколько раз, метод не сообщает обо всех копиях. Он возвращает только самый левый индекс. В примере fruits.index('банан') остановится на позиции 1.

items = [4, 1, 7, 4, 2]
offset = items.index(4, 2)
print(offset)

изменить элементы списка python (изменение элементов списка в python)

3

Python элементы списка в другой список (копирование элементов списка в другой список)

Здесь список [4, 1, 7, 4, 2], поиск начинается с индекса 2, поэтому элемент со значением 4 пропущен, а следующая позиция равна 3.

Когда искомого элемента нет, list.index порождает ValueError. Такое поведение останавливает программу при отсутствии обработки. Исключение можно увидеть на простом примере:

letters = ['a', 'b']
letters.index('c')

Python 3 append (метод append в python 3)

ValueError: 'c' is not in list

поменять элементы местами python (обмен элементов местами)

Проверка вхождения перед вызовом index

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

Оператор in выполняет проверку принадлежности элемента списку. После положительного ответа метод index вызывается безопасно.

animals = ['кот', 'пёс', 'ёж']
wanted = 'ёж'
if wanted in animals:
    idx = animals.index(wanted)
    print('Позиция:', idx)
else:
    print('Значение не найдено')

найти индекс списка python (поиск индекса в списке python)

Позиция: 2

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

Ветка else позволяет вернуть -1, записать сообщение в журнал или предложить пользователю выбрать другое значение.

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

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

Блок try и except применяется, когда потеря элемента считается исключительным случаем, а не обычным условием.

shops = ['пятерочка', 'магнит']
try:
    pos = shops.index('лента')
except ValueError:
    pos = -1
print(pos)

Last index python (последний индекс в python)

-1

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

Значение -1 принято использовать как признак того, что поиск не дал результата. Такой код передаёт управление дальше без остановки.

Все индексы повторяющегося элемента

Как найти все номера позиций, на которых стоит одно и то же значение?

Для сбора полного списка позиций применяют enumerate и генератор списка. Один проход по списку позволяет сравнить каждый элемент с целевым значением.

row = ['а', 'б', 'а', 'в', 'а']
target = 'а'
positions = [i for i, elem in enumerate(row) if elem == target]
print(positions)

Python список значений (список значений в python)

[0, 2, 4]

Python список чисел (список чисел в python)

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

Ошибка заключается в попытке делать несколько вызовов index в цикле и вручную настраивать старт. Условие остановки легко записать неверно, что приведёт к зацикливанию или потере последнего элемента. Проще один раз применить enumerate.

Первое подходящее под условие значение

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

Когда требуется позиция числа больше порога, строки с определённым префиксом или объекта с нужным полем, используют генераторное выражение с next.

numbers = [3, 8, 5, 12, -4]
limit = 10
idx = next((i for i, v in enumerate(numbers) if v > limit), -1)
print(idx)

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

3

Python list int (список целых чисел в python)

next останавливает перебор после первого совпадения. Если все элементы не удовлетворяют условию, возвращается запасное значение -1.

Последнее вхождение значения

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

Встроенный index движется слева. Чтобы найти последнее вхождение, разворачивают список и пересчитывают найденную позицию.

letters = ['a', 'b', 'a', 'c', 'b']
value = 'b'
last = len(letters) - 1 - letters[::-1].index(value)
print(last)

повторение списка python (повторение списка в python)

4

В перевёрнутом виде letters[::-1] имеет вид ['b', 'c', 'a', 'b', 'a']. Разворот даёт index 0 для нужного значения, после пересчёта выходит 5 минус 1 минус 0, то есть 4.

letters[::-1] создаёт копию списка в памяти. Для очень больших списков такая копия заметно увеличивает расход памяти. Тогда лучше применить цикл while от конца к началу и прервать его после первого совпадения.

- Python элементы списка (элементы списка в python)
- динамические списки python (динамические списки в python)
- Python последний элемент списка (последний элемент списка python)

Дополнительные примеры расширяют работу с индексом и показывают нестандартные ситуации.

Пример 1. Нахождение всех вхождений методом index со стартовой позицией

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

Пример
def all_positions(items, value):
    result = []
    current = 0
    while True:
        try:
            found = items.index(value, current)
            result.append(found)
            current = found + 1
        except ValueError:
            break
    return result

numbers = [1, 2, 1, 3, 1]
print(all_positions(numbers, 1))
[0, 2, 4]

Цикл продолжается до тех пор, пока index находит значение. Исключение ValueError служит сигналом окончания перебора.

Пример 2. Индекс минимального и максимального элемента

Для поиска позиции min или max достаточно сначала получить значение функцией min или max, а затем передать его в index. Альтернативный способ использует range и функцию ключа.

Пример
values = [12, 0, 18, 4, 97]
min_position = values.index(min(values))
max_position = max(range(len(values)), key=values.__getitem__)
print('Минимум:', min_position)
print('Максимум:', max_position)
Минимум: 1
Максимум: 4

Функция max с key вызывает values.__getitem__ для каждого индекса. Результатом становится индекс элемента с наибольшим значением.

Пример 3. Поиск индекса в списке списков и кортежей

Если список содержит вложенные объекты, равенство проверяется по содержимому кортежа или вложенного списка.

Пример
matrix = [[1, 2], [3, 4], [5, 6]]
sub = [3, 4]
matrix_pos = matrix.index(sub)
print('Подсписок:', matrix_pos)

points = [(0, 5), (2, 8), (4, 9)]
current = (2, 8)
point_pos = points.index(current)
print('Кортеж:', point_pos)
Подсписок: 1
Кортеж: 1

Вложенный объект должен совпадать по порядку значений. Список [4, 3] не считается равным [3, 4].

Пример 4. Поиск индекса объекта в списке по его свойствам

Пример
class Worker:
    def __init__(self, name, salary):
        self.name = name
        self.salary = salary

team = [
    Worker('Иван', 45000),
    Worker('Мария', 65000),
    Worker('Олег', 35000)
]
premium = next(
    (i for i, worker in enumerate(team) if worker.salary > 50000),
    -1
)
print(premium)
1

Метод index не подходит для сравнения по отдельному полю объекта. Обход enumerate даёт индекс и объект одновременно, поэтому условие можно отнести к свойству worker.salary.

Пример 5. Индекс в отсортированном списке с помощью bisect

Пример
from bisect import bisect_left

def sorted_index(sorted_items, value):
    position = bisect_left(sorted_items, value)
    if position != len(sorted_items) and sorted_items[position] == value:
        return position
    raise ValueError('Значение не находится в списке')

marks = [3, 4, 4, 5, 5, 5]
print(sorted_index(marks, 5))
3

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

Пример 6. Индексы элементов, соответствующих нескольким условиям

Пример
data = [14, 3, 19, 27, 8, 22, 5]
selected = [i for i, value in enumerate(data) if value > 10 and value % 2 == 0]
print(selected)
[0, 5]

Из списка выбраны значения 14 и 22, так как они больше 10 и делятся на два. Генератор списка помещает в результат индексы 0 и 5.

Поиск индекса в списке Python - comments

En
найти индекс списка python (python)