2011-02-01 17 views
6

Duplicar posibles:
In python, how do I take the highest occurrence of something in a list, and sort it that way?Tome una lista, ordenar por popularidad y luego eliminar duplicados

Hola a todos,

Busco una manera fácil para ordenar una lista por popularidad y luego eliminar elementos duplicados.

Por ejemplo, dada una lista:

[8, 8, 1, 1, 5, 8, 9] 

me permitiría terminar con una lista como la siguiente:

[8, 1, 5, 9] 
+0

deben darle un mejor ejemplo. En el tuyo, el orden de popularidad es el mismo que el orden natural de los dígitos. Si tuviera dos nueves, ¿sería '[1,3,9,5]'? –

+0

Sí. ¡perdón por la confusion! –

+0

@kahm: no se puede ordenar una lista por popularidad. Tienes que crear alguna otra estructura intermedia que contenga los recuentos. ¿Qué otras estructuras has mirado? –

Respuesta

12

@SilentGhost tiene una excelente solución para Python 2.7+. Una solución relativamente simple para 2,6 o más:

a = [8, 8, 1, 1, 5, 8, 9] 

popularity = sorted(set(a), key=lambda x: -a.count(x)) 

[8, 1, 5, 9] 

Esta solución es, sin embargo, costoso (debido a count).

Aquí otra, una mejor solución con el diccionario temporal:

a = [8, 8, 1, 1, 5, 8, 9] 
d = {} 
for i in a: 
    d[i] = d.get(i, 0) + 1 
popularity = sorted(d, key=d.get, reverse=True) 
+5

esto es muy costoso para listas grandes. – SilentGhost

+0

@SilentGhost - tienes razón. He agregado una mejor solución con dict. – eumiro

+1

pensaría que 'key = d.get' sería suficiente. – SilentGhost

13
>>> lst = [1, 1, 3, 3, 5, 1, 9] 
>>> from collections import Counter 
>>> c = Counter(lst) 
>>> [i for i, j in c.most_common()] 
[1, 3, 5, 9] 

ver collections.Counter documentos de los vínculos con el legado VERSIONS- implementaciones compatibles.

+2

Debe mencionar que 'Contador' solo está disponible en Python 2.7+. Aquí hay una implementación para pre 2.7: http://code.activestate.com/recipes/576611/ (o uno solo puede usar un loop y dict normales;)) –

+0

@Felix: before 'Counter', there' defaultdict' :) –

Cuestiones relacionadas