Поиск значения индекса наименьшего числа в списке?
Скажем, у меня есть список чисел [ 20, 15, 27, 30 ]
Как мне вернуть индексный индекс наименьшего значения в этом списке. (15
) Очевидно, что min (lst) вернет наименьшее число, но как вместо этого вернуть индекс "1
"?
Ответы
Ответ 1
Поскольку вы уже знаете, как найти минимальное значение, вы просто передаете это значение функции index()
, чтобы получить индекс этого значения в списке. То есть,
n = [20, 15, 27, 30]
n.index(min(n))
дает
1
Это вернет индекс минимального значения в списке. Обратите внимание, что если есть несколько минимумов, он вернет первый.
min(): с помощью единственного аргумента iterable верните наименьший элемент непустого итерации (например, строки, кортежа или списка). С более чем одним аргументом верните наименьший из аргументов.
list.index(x):
Верните индекс в список первого элемента, значение которого равно x. это
ошибка, если такой элемент отсутствует.
Ответ 2
>>> L = [20, 15, 27, 30]
>>> min(range(len(L)), key=L.__getitem__)
1
Ответ 3
Другая опция, зависящая от сложности данных:
import heapq
s = [20, 15, 27, 30]
heapq.nsmallest(1, ((k, i) for i, k in enumerate(s)))
Ответ 4
Это похоже на ответ @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])