Questo è simile alla risposta di @ Jon Clements. Il suo uso è heapq
il che significa che può essere utilizzato per trovare più di un valore minimo. Invece di usare itemgetter()
, inverte semplicemente l'ordine dei valori nelle tuple in modo che siano naturalmente ordinati nell'ordine corretto.
Se tutto ciò che serve è il singolo più piccolo valore, questo è un modo semplice:
from operator import itemgetter
lst = [20, 15, 27, 30]
i, value = min(enumerate(lst), key=itemgetter(1))
enumerate()
è il solito modo in Python per accoppiare i valori da un elenco e loro indici; restituisce un iteratore che produce tuple come (i, value)
dove value
è un valore della sequenza originale e i
è l'indice di tale valore all'interno della sequenza. min()
può eseguire un iteratore; l'argomento key=
è impostato su una funzione che ignora il valore dell'indice accoppiato e trova solo il secondo valore minimo (indice 1) all'interno di ciascuna tupla.
min()
restituisce la tupla che trova con il valore minimo e quindi usiamo la decompressione tupla per assegnare i valori a i
e value
.
L'esempio mostrato è una lista, ma questo dovrebbe funzionare con qualsiasi sequenza tra cui un iteratore:
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))
Nota che itemgetter(n)
è una fabbrica che rende gli oggetti richiamabili. Con itemgetter(1)
si ottiene un callable che restituisce il secondo elemento (indice 1) in una sequenza (in questo caso, una tupla).Si potrebbe anche scrivere una funzione o una funzione lambda
a fare la stessa cosa:
def get1(x):
return x[1]
i, value = min(enumerate(lst), key=get1)
i, value = min(enumerate(lst), key=lambda x: x[1])
Questo è (probabilmente) più veloce in generale, perché il più noto caso peggiore complessità legata per la costruzione di un heap è O (n), mentre il confronto gli ordinamenti hanno un limite di caso peggiore O (nlog (n)). Tuttavia, sarebbe comunque opportuno profilare le due implementazioni per garantire che le implementazioni Python di queste strutture dati siano coerenti con i migliori limiti del caso. – mvanveen
Mi piace perché funzionerebbe su un iteratore. – steveha