2011-02-01 9 views
6

Eventuali duplicati:
In python, how do I take the highest occurrence of something in a list, and sort it that way?Prendere un elenco, in ordine di popolarità e quindi rimuovere i duplicati

Ciao a tutti,

Sto cercando un modo semplice per ordinare un elenco per popolarità e quindi rimuovere elementi duplicati.

Ad esempio, dato un elenco:

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

Vorrei poi finire con una lista come la seguente:

[8, 1, 5, 9] 
+0

si dovrebbe dare un esempio migliore. Nel tuo, l'ordine di popolarità è lo stesso dell'ordine naturale delle cifre. Se avessi due nove, sarebbe '[1,3,9,5]'? –

+0

Sì. dispiace per la confusione! –

+0

@kahm: non è possibile ordinare una lista per popolarità. Devi creare un'altra struttura intermedia che contenga i conteggi. Quali altre strutture hai guardato? –

risposta

12

@SilentGhost ha una soluzione eccellente per Python 2.7+. Una soluzione relativamente semplice per 2,6 e più anziani:

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

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

[8, 1, 5, 9] 

Questa soluzione, tuttavia, è costoso (a causa di count).

Ecco un'altra, una migliore soluzione con il dizionario temporanea:

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

questo è molto costoso per le liste di grandi dimensioni. – SilentGhost

+0

@SilentGhost - hai ragione. Ho aggiunto una soluzione migliore con dict. – eumiro

+1

penso che 'key = d.get' sia sufficiente. – 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] 

vedere collections.Counter docs per i collegamenti alle eredità versioni- implementazioni compatibili.

+2

Si dovrebbe ricordare che 'Counter' è disponibile solo in Python 2.7+. Ecco un'implementazione per il pre 2.7: http://code.activestate.com/recipes/576611/ (oppure si può semplicemente usare un normale loop e dict;)) –

+0

@Felix: prima di 'Counter', c'è' defaultdict' :) –

Problemi correlati