Поиск значения индекса наименьшего числа в списке?

Скажем, у меня есть список чисел [ 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])