2012-03-18 23 views
5

Vorrei creare un elenco maxValues ​​ contenente i primi 20 valori da un elenco di numeri interi lst.Filtro max 20 valori da un elenco di numeri interi

maxValues = [] 
for i in range(20): 
    maxValues.append(max(lst)) 
    lst.remove(max(lst)) 

C'è un codice più compatto per ottenere questo compito o anche una funzione integrata?

+2

Non è solo la compattezza. Il tuo codice (se corretto, l'istruzione 'del' è errata) è O (n * k), mentre gli altri metodi sono O (nlogn). – agf

+0

@agf, grazie, corretto. – xralf

risposta

12

C'è heapq.nlargest():

maxvalues = heapq.nlargest(20, lst) 

Dal doc:

heapq.nlargest(n, iterable, key=None)

Return un elenca gli elementi più grandi di th e dataset definito da iterable. key, se previsto, specifica una funzione di un argomento che viene usato per estrarre una chiave di confronto da ogni elemento del iterabile: key=str.lower Equivalente a: sorted(iterable, key=key, reverse=True)[:n]

O allo stesso modo in cui utilizzare heapq.nsmallest() se si desidera che il più piccolo.

NOTA IMPORTANTEfrom the doc:

Le ultime due funzioni [nlargest e nsmallest] eseguire migliore per valori piccoli di n. Per valori maggiori, è più efficiente utilizzare la funzione sorted(). Inoltre, quando n==1, è più efficiente utilizzare le funzioni integrate min() e max().

+0

Grazie. È meglio della mia risposta. Probabilmente è più veloce quando la lista è molto lunga perché non è necessario ordinare l'intera lista. –

+0

@ Rémi: ho aggiunto una nota dal documento che confronta quando le due soluzioni. –

+0

Grazie per la risposta completa. – xralf

5
sorted(lst)[-20:] 

è il più breve che riesco a pensare. Probabilmente anche più veloce.

(a cura: primo tentativo trovato il min anziché il massimo)

+0

Ho accettato l'altra risposta perché è più completa ma ho usato la soluzione semplice e veloce. – xralf

Problemi correlati