Как вычислить индекс нужного объекта в структуре данных 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 от конца к началу и прервать его после первого совпадения.
Дополнительные примеры расширяют работу с индексом и показывают нестандартные ситуации.
Пример 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.