Скажем, у меня есть список чисел [ 20, 15, 27, 30 ]
Как мне вернуть индексный индекс наименьшего значения в этом списке. (15) Очевидно, что min (lst) вернет наименьшее число, но как вместо этого вернуть индекс "1"?
Скажем, у меня есть список чисел [ 20, 15, 27, 30 ]
Как мне вернуть индексный индекс наименьшего значения в этом списке. (15) Очевидно, что min (lst) вернет наименьшее число, но как вместо этого вернуть индекс "1"?
Поскольку вы уже знаете, как найти минимальное значение, вы просто передаете это значение функции index(), чтобы получить индекс этого значения в списке. То есть,
n = [20, 15, 27, 30]
n.index(min(n))
дает
1
Это вернет индекс минимального значения в списке. Обратите внимание, что если есть несколько минимумов, он вернет первый.
min(): с помощью единственного аргумента iterable верните наименьший элемент непустого итерации (например, строки, кортежа или списка). С более чем одним аргументом верните наименьший из аргументов.
list.index(x): Верните индекс в список первого элемента, значение которого равно x. это ошибка, если такой элемент отсутствует.
>>> L = [20, 15, 27, 30]
>>> min(range(len(L)), key=L.__getitem__)
1
Другая опция, зависящая от сложности данных:
import heapq
s = [20, 15, 27, 30]
heapq.nsmallest(1, ((k, i) for i, k in enumerate(s)))
Это похоже на ответ @Jon Clements. Его использует heapq, что означает, что он может использоваться для поиска более чем одного наименьшего значения. Вместо использования itemgetter() он просто меняет порядок значений в кортежах, поэтому они, естественно, сортируются в правильном порядке.
Если вам нужно только одно наименьшее значение, это простой способ:
from operator import itemgetter
lst = [20, 15, 27, 30]
i, value = min(enumerate(lst), key=itemgetter(1))
enumerate() - это обычный способ в Python для объединения значений из списка и их индексов; он возвращает итератор, который возвращает кортежи типа (i, value), где value является значением из исходной последовательности, а i является индексом этого значения в последовательности. min() может принимать итератор; аргументу key= задана функция, которая игнорирует значение парного индекса и просто находит минимальное второе значение (индекс 1) в каждом кортеже.
min() возвращает кортеж, который он находит с минимальным значением, а затем мы используем распаковку кортежа для назначения значений i и value.
Показанный пример - это список, но это будет работать с любой последовательностью, включая итератор:
from random import randint
def rseq(n=20):
for i in xrange(n):
yield randint(0, 101)
i, value = min(enumerate(rseq()), key=itemgetter(1))
Обратите внимание, что itemgetter(n) является factory, который делает вызываемые объекты. С помощью itemgetter(1) вы получаете вызываемый код, который возвращает второй элемент (индекс 1) в последовательности (в данном случае кортеж). Вы также можете написать функцию или функцию lambda, чтобы сделать то же самое:
def get1(x):
return x[1]
i, value = min(enumerate(lst), key=get1)
i, value = min(enumerate(lst), key=lambda x: x[1])