2010-02-11 17 views
15

¿Cuál es la forma más eficiente, elegante y pitónica de resolver este problema?cómo obtener de manera eficiente los elementos k más grandes de una lista en python

Dada una lista (o conjunto o lo que sea) de n elementos, queremos obtener los k más grandes. (Se puede suponer k<n/2 sin pérdida de generalidad, supongo) Por ejemplo, si la lista fueron:

l = [9,1,6,4,2,8,3,7,5] 

n = 9, y digamos k = 3. ¿Cuál es el algoritmo más eficiente para la recuperación de la 3 los más grandes? En este caso deberíamos obtener [9,8,7], sin ningún orden en particular.

Gracias! Manuel

+0

+1 Ahora que se sirve el propósito básico, deje que haya ¿GOLF? –

Respuesta

33

Uso nlargest del módulo heapq

from heapq import nlargest 
lst = [9,1,6,4,2,8,3,7,5] 
nlargest(3, lst) # Gives [9,8,7] 

También puede dar una clave para nlargest en caso de que quiere cambiar sus criterios:

from heapq import nlargest 
tags = [ ("python", 30), ("ruby", 25), ("c++", 50), ("lisp", 20) ] 
nlargest(2, tags, key=lambda e:e[1]) # Gives [ ("c++", 50), ("python", 30) ] 
+0

+1: No sabía nada de este módulo ... gracias – mshsayem

+0

Excelente clasificación de idiomas :)) –

7
l = [9,1,6,4,2,8,3,7,5] 

sorted(l)[-k:] 
+0

Eso es mejor que el mío) – Rorick

+0

... pero no funciona en el caso muy específico de k == 0. :) – EOL

4

Usted puede utilizar el módulo heapq .

>>> from heapq import heapify, nlargest 
>>> l = [9,1,6,4,2,8,3,7,5] 
>>> heapify(l) 
>>> nlargest(3, l) 
[9, 8, 7] 
>>> 
+2

no necesitamos heapify aquí – garg10may

4
sorted(l, reverse=True)[:k] 
7

El simple, O (log n n) forma es para ordenar la lista a continuación, obtener los últimos k elementos.

La manera correcta es usar un selection algorithm, que se ejecuta en tiempo O (n + k log k).

También, heapq.nlargesttakes O(n log k) time, que puede o no ser lo suficientemente bueno.

(Si k = O (n), entonces los 3 algoritmos tienen la misma complejidad (es decir, no molestar). Si k = O (log n), el algoritmo de selección descrito en Wikipedia es O (n) y heapq.nlargest es O (n log log n), pero el logaritmo doble es "lo suficientemente constante" para la práctica n que no importa.)

Cuestiones relacionadas