2012-03-18 13 views
5

Deseo crear una lista maxValues ​​ que contenga los primeros 20 valores de una lista de enteros lst.Filtrar máx. 20 valores de una lista de enteros

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

¿Hay un código más compacto para lograr esta tarea o incluso función incorporada?

+2

No es solo compacidad. Su código (si se corrige, la declaración 'del' es incorrecta) es O (n * k), mientras que los otros métodos son O (nlogn). – agf

+0

@agf, Gracias, corregido. – xralf

Respuesta

12

Hay heapq.nlargest():

maxvalues = heapq.nlargest(20, lst) 

Desde el doc:

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

devolver una lista con los n elementos más grandes de th e conjunto de datos definido por iterable. key, si se proporciona, especifica una función de un argumento que se utiliza para extraer una clave de comparación de cada elemento en el iterable: key=str.lower Equivalente a: sorted(iterable, key=key, reverse=True)[:n]

O en la misma manera utilizar heapq.nsmallest() si desea que el pequeñísimo.

NOTA IMPORTANTEfrom the doc:

Las últimas dos funciones [nlargest y nsmallest] realizan mejor para valores más pequeños de n. Para valores más grandes, es más eficiente usar la función sorted(). Además, cuando n==1, es más eficiente usar las funciones integradas min() y max().

+0

Gracias. Eso es mejor que mi respuesta. Es probable que sea más rápido cuando la lista es muy larga porque no hay necesidad de ordenar toda la lista. –

+0

@ Rémi: agregué una nota del documento que compara cuándo las dos soluciones. –

+0

Gracias por la respuesta completa. – xralf

5
sorted(lst)[-20:] 

es lo más corto que se me ocurre. Probablemente sea más rápido también.

(editado: primer intento encontrado el min en lugar del máximo)

+0

Acepté la otra respuesta porque es más completa, pero utilicé su solución simple y rápida. – xralf

Cuestiones relacionadas