Поиск индекса элемента списка: примеры кода на Python
Метод index() для списка в Python
Каждый элемент списка имеет порядковый номер, начинающийся с нуля. Для получения этого номера по значению применяется метод list.index(). Метод возвращает индекс первого вхождения слева направо.
Основной способ поиска индекса: список.index(значение, start, end). Обязателен только первый аргумент, start и end задают границы просмотра. Пример вызова без дополнительных параметров:
fruits = ["яблоко", "груша", "слива", "персик"]
position = fruits.index("слива")
print(position)Python copy list (копирование списка в python)
2
Python list extend (метод extend для списка)
Метод сравнивает значения через ==. Если элемент встречается несколько раз, возвращается самый ранний индекс.
Когда искомого значения нет, интерпретатор прерывает выполнение ошибкой ValueError. Чтобы программа продолжила работу, перед вызовом проверяют наличие элемента оператором in либо перехватывают исключение:
values = [1, 2, 3]
target = 5
if target in values:
result = values.index(target)
else:
result = -1
print(result)
Python list index (индекс элемента списка в python)
-1
элемент двумерного массива python (доступ к элементу двумерного массива (списка списков) в python)
Как вручную найти индекс элемента с помощью перебора?
Если нужно добавить собственное условие сравнения, цикл с enumerate() даёт полный контроль над процессом. Функция создаёт пары «номер, элемент», а оператор if проверяет совпадение.
items = ["кот", "пёс", "лось"]
target = "лось"
for index, value in enumerate(items):
if value == target:
print(index)
breakколичество элементов массива python (количество элементов в списке (массиве) с помощью len в python)
2
Python 3 индекс элемента (получение индекса элемента в списке/строке python 3)
Подход удобен, когда объект требуется найти не по значению, а по признаку, например, по одному из полей. Встроенный метод index сравнивает напрямую, поэтому для признаков используется цикл. Случай с большим списком: метод index обычно работает быстрее, так как написан на C.
Как найти все индексы вхождения значения, если дубликатов несколько?
Метод index останавливается на первом совпадении. Для полного перечня позиций применяется генератор списка с enumerate:
digits = [4, 2, 4, 8, 4]
positions = [i for i, x in enumerate(digits) if x == 4]
print(positions)Python максимальный элемент массива (поиск максимального элемента в списке с помощью max в python)
[0, 2, 4]
Python одинаковые элементы списков (поиск одинаковых (повторяющихся) элементов в списках python)
Генератор создаёт новый список, поэтому при очень большой длине исходного списка память расходуется заметно. Альтернатива - цикл while с параметром start:
digits = [4, 2, 4, 8, 4]
value = 4
start = 0
while True:
try:
found = digits.index(value, start)
print(found)
start = found + 1
except ValueError:
breakпроизведение элементов списка python (вычисление произведения элементов списка (через цикл или reduce) в python)
0 2 4
Цикл с index подходит для потоковой обработки: каждый найденный индекс используется сразу, а не накапливается в отдельном списке.
Как вернуть индекс или значение по умолчанию, если элемента нет?
Перехват ValueError позволяет написать функцию, которая всегда возвращает число. Такой приём часто используется в коде, где отсутствие значения не должно останавливать работу.
def safe_index(data, target, default=-1):
try:
return data.index(target)
except ValueError:
return default
marks = [3, 5, 4, 5]
print(safe_index(marks, 5))
print(safe_index(marks, 2))
1 -1
Второй вызов вернул значение по умолчанию, потому что оценки 2 в списке нет. Этот способ применяется в проектах, где функция должна гарантированно вернуть либо индекс, либо замену.
Как найти индекс последнего появления элемента?
Встроенного метода для поиска с конца нет. Самый короткий способ: развернуть список срезом, найти первый индекс и пересчитать его относительно исходного списка.
letters = ["a", "b", "a", "c"]
last = len(letters) - 1 - letters[::-1].index("a")
print(last)
2
Срез создаёт копию, поэтому для больших списков рациональнее выполнить обратный цикл с break:
letters = ["a", "b", "a", "c"]
for i in range(len(letters) - 1, -1, -1):
if letters[i] == "a":
print(i)
break
2
Первый вариант отличается краткостью, второй экономит память. Выбор обусловлен длиной списка и допустимостью дополнительной копии.
Как найти индекс в определённом диапазоне индексов?
Параметры start и end задают границы поиска. Это позволяет пропустить начало списка или ограничить просмотр срезом без его создания.
nums = [5, 1, 8, 1, 9, 1]
print(nums.index(1, 2))
print(nums.index(1, 2, 5))
3 3
В первом вызове поиск идёт от индекса 2 до конца, во втором - среди индексов 2, 3 и 4, так как end исключается. Такой вариант используется при работе с подсписками: лента логов, диапазоны дат, сортированные группы данных.
Расширенные примеры показывают менее очевидные возможности поиска индекса в списке.
Поиск с отрицательными границами. Параметры start и end принимают отрицательные значения, как при обычной работе со срезами. Отрицательное число обозначает позицию от конца списка.
vals = [10, 20, 30, 40, 50]
print(vals.index(40, -2)) # старт с индекса 3
print(vals.index(30, 1, -1)) # от индекса 1 до предпоследнего
3 2
Поиск кортежа по содержимому. Метод index работает с любыми сравнимыми объектами. Кортежи считаются равными, если их элементы совпадают.
points = [(1, 2), (3, 4), (5, 6)]
idx = points.index((3, 4))
print(idx)
1
Поиск по полю объекта. Если список хранит объекты собственного класса, можно переопределить __eq__, и метод index станет применять нужное сравнение.
class Worker:
def __init__(self, name, salary):
self.name = name
self.salary = salary
def __eq__(self, other):
return self.salary == other.salary
workers = [
Worker("Anna", 60000),
Worker("Ivan", 50000),
Worker("Petr", 70000),
]
candidate = Worker("Elena", 60000)
print(workers.index(candidate))
0
Условный поиск с генератором. Функция next в сочетании с enumerate находит первый элемент по произвольному условию и возвращает индекс. Второй аргумент next служит значением по умолчанию, если подходящего элемента нет.
people = [
{"name": "Анна", "age": 25},
{"name": "Игорь", "age": 19},
{"name": "Ольга", "age": 31},
]
idx = next((i for i, person in enumerate(people) if person["age"] >= 30), -1)
print(idx)
2
Все позиции без дополнительного прохода по списку. Метод index с управляемым стартом собирает вхождения в цикле. Такой приём удобен, когда нужно обрабатывать каждую позицию поочерёдно.
events = ["click", "scroll", "click", "hover", "click"]
event = "click"
start = 0
indices = []
while True:
try:
found = events.index(event, start)
indices.append(found)
start = found + 1
except ValueError:
break
print(indices)
[0, 2, 4]
Индекс максимума или минимума. Метод index позволяет найти позицию максимального или минимального значения в списке. Одновременный вызов max и min делает код читаемым.
prices = [150, 90, 230, 175]
print(prices.index(max(prices)))
print(prices.index(min(prices)))
2 1
Преобразование индекса в отрицательный. Иногда удобно представить позицию как расстояние от конца. Для этого из индекса вычитают длину списка.
letters = ["a", "b", "c", "d"]
idx = letters.index("c")
print(idx)
print(idx - len(letters))
2 -2
Поиск в сортированном списке без index. Для отсортированного списка операция бинарного поиска находит позицию за логарифмическое время. Модуль bisect возвращает точку вставки, после чего проверяется совпадение значения.
from bisect import bisect_left
sorted_items = [10, 20, 30, 40, 50]
target = 30
pos = bisect_left(sorted_items, target)
if pos < len(sorted_items) and sorted_items[pos] == target:
result = pos
else:
result = -1
print(result)
2
Сложности сравнения булевых значений и чисел. Оператор == считает True равным 1, поэтому метод index может вернуть неожиданную позицию. Список может содержать 0, False и True одновременно, и индекс определяется первым совпадением по правилам равенства.
flags = [0, False, 2, True]
print(flags.index(True))
print(flags.index(1))
3 3
Список с условием и перебор всех подходящих индексов. Генератор списка с enumerate применяется для любых проверок, а не только для равенства значению.
values = [-5, 3, -2, 7, -1]
positive_indexes = [i for i, v in enumerate(values) if v > 0]
print(positive_indexes)
[1, 3]