2013-04-15 17 views
8

In sostanza se dato un elenco:Come organizzare l'elenco per frequenza di occorrenza e in ordine alfabetico (in caso di parità) eliminando i duplicati?

data = ["apple", "pear", "cherry", "apple", "pear", "apple", "banana"] 

Sto cercando di fare una funzione che restituisce una lista come questa:

["apple", "pear", "banana", "cherry"] 

che sto cercando di fare l'elenco di ritorno ordinato da più di frequente parola che si verifica prima durante la rottura di legami ordinandoli in ordine alfabetico. Sto anche cercando di eliminare i duplicati.

Ho già creato elenchi dei conteggi di ciascun elemento e degli indici di ciascun elemento nei dati.

x = [n.count() for n in data] 
z = [n.index() for n in data] 

Non so dove andare da questo punto.

+2

Questo suona come compiti a casa. Forse dovresti vedere la tua altra domanda http://stackoverflow.com/questions/16006404/how-to-find-most-common-element-in-list-and-if-theres-a-tie-the-one-whos -las/16006441 # 16006441 – Jeff

risposta

16

Si potrebbe fare qualcosa di simile:

from collections import Counter 

data = ["apple", "pear", "cherry", "apple", "pear", "apple", "banana"] 

counts = Counter(data) 
words = sorted(counts, key=lambda word: (-counts[word], word)) 

print words 
+1

+1 Questa è l'unica risposta finora che ha richiesto il tie-breaker OP. – hughdbrown

+0

soluzione molto bella – jamylak

+0

Sono un po 'confuso come nella funzione sorted(), il programma capisca che "word" è associata a singole chiavi nel dizionario "counts". – Sean

3

Per gli elementi in base alla frequenza è possibile utilizzare, collections.most_common documentazione here ordinare, così per esempio

from collections import Counter 

data = ["apple", "pear", "cherry", "apple", "pear", "apple", "banana"] 
print Counter(data).most_common() 
#[('apple', 3), ('pear', 2), ('cherry', 1), ('banana', 1)] 

Grazie alla @Yuushi,

from collections import Counter 

data = ["apple", "pear", "cherry", "apple", "pear", "apple", "banana"] 
x =[a for (a, b) in Counter(data).most_common()] 

print x 
#['apple', 'pear', 'cherry', 'banana'] 
+0

+1, ma per ottenerlo nel formato che l'OP vuole, si vorrebbe fare qualcosa come 'x = [a for (a, b) in Counter (dati) .most_common()]' – Yuushi

+0

Ho provato questo all'inizio, ma "ciliegia" e "banana" vengono scambiate. – Blender

+1

o: 'dall'operatore import itemgetter; x = map (itemgetter (0), Counter (data) .most_common()) 'Inoltre, questo codice non implementa l'OP di tie-break richiesto. – hughdbrown

0

Ecco un approccio semplice, ma dovrebbe funzionare.

data = ["apple", "pear", "cherry", "apple", "pear", "apple", "banana"] 

from collections import Counter 
from collections import defaultdict 

my_counter = Counter(data) 

# creates a dictionary with keys 
# being numbers of occurrences and 
# values being lists with strings 
# that occured a given time 
my_dict = defaultdict(list) 
for k,v in my_counter.iteritems(): 
    my_dict[v].append(k) 

my_list = [] 

for k in sorted(my_dict, reverse=True): 
    # This is the second tie-break, if both 
    # strings showed up the same number of times 
    # and correspond to the same key, we sort them 
    # by the alphabetical order 
    my_list.extend(sorted(my_dict.get(k))) 

Risultato:

>>> my_list 
['apple', 'pear', 'banana', 'cherry'] 
+0

@jamylak Non lo sapevo. Grazie. – Akavall

+0

non esitare ad aggiornare il tuo codice, se lo desideri – jamylak

Problemi correlati