Опубликован: 10.01.2024 74
В Python отсутствует способ прямого получения индекса максимального или минимального элемента последовательности (списка, кортежа и т.п.) с помощью какой-либо встроенной функции или метода.
Вместе с тем, есть три элегантных способа (трюка) для решения этой задачи:
enumerate()
;range()
, len()
и lambda
;index()
.enumerate()
.# нахождение индекса максимального элемента списка
list_a = [ 5, 7, 2, 25, 10, 25 ]
index_max = max((item, i) for i, item in enumerate(list_a))[1]
print(index_max)
5
Если в списке есть два или более элемента с максимальным значением, то этот способ возвращает индекс последнего из них.
Чтобы получить индекс первого вхождения, нужно изменить выражение index_max
, указав знак -
перед функцией max()
и перед индексом элементов перебираемой последовательности -i
:
list_a = [ 5, 7, 2, 25, 10, 25 ]
index_max = -max((item, -i) for i, item in enumerate(list_a))[1]
print(index_max)
3
range()
, len()
и lambda
.Этот способ позволяет получать индекс первого вхождения максимального элемента последовательности даже если таких элементов несколько.
list_a = [ 5, 7, 2, 25, 10, 25 ]
index_max = max( range(len(list_a)), key=lambda x: list_a[x] )
print(index_max)
3
index()
.Метод index()
возвращает индекс элемента списка, переданного в качестве аргумента. Поэтому, если передать в метод index()
результат применения к списку функции max()
, то получим индекс максимального элемента списка.
list_a = [ 5, 7, 2, 25, 10, 25 ]
index_max = list_a.index(max(list_a))
print(index_max)
3
min()
вместо max()
.list_a = [ 5, 7, 2, 25, 10, 25 ]
index_min = min( range(len(list_a)), key=lambda x: list_a[x] )
print(index_min)
2
index_min = list_a.index(min(list_a))
print(index_min)
2
Методы преобразования списка в строку и обратно
Фильтрация элементов итератора с помощью bool-списка функции itertools.compress()
Пропуск не нужных элементов последовательности с помощью itertools.dropwhile()
Комментариев нет.