2016-02-17 10 views
5

Ho unCome ordinare un elenco con gli elementi duplicati da parte del maggior numero di occorrenze duplicati - Python

list1 = ["one", "two", "two", "three", "four" , "five", "five", "five", "six"] 

e l'uscita dovrebbe essere

list2 = ["five" , "two", "one", "three" , "six"] 
  • "five" è il primo elemento perché in lista1 ha il maggior numero di occorrenze (3)
  • "two "è il secondo elemento perché in list1 ha il successivo numero più alto di o ccurrences (2)
  • "one", "three "e "six" hanno lo stesso numero inferiore di eventi (1) in modo che siano gli ultimi a mio list2 - non importa quale sia la posizione che sarà fintanto che sono dopo" cinque "e" due ". In breve, list2 = ["five" , "two", "six", "three" , "one"] o list2 = ["five" , "two", "three", "one" , "six"] o qualsiasi altra variazione sono accettate.

ho potuto risolvere questo con la creazione di un dizionario per memorizzare il numero di occorrenze e quindi creare un nuovo elenco con i miei articoli ordinati dal dict

my_dict = {i:list1.count(i) for i in list1} 

ma ho bisogno di qualcosa di più pulito

risposta

6

È potrebbe utilizzare un elenco di comprensione e Counter:

from collections import Counter 
print([element for element,count in Counter(list1).most_common()]) 

Uscite:

['five', 'two', 'three', 'six', 'four', 'one'] 
+0

Questo è esattamente ciò di cui avevo bisogno. @ donkey-kong Grazie! – faceoff

1

Si potrebbe utilizzare itertools.groupby() per ottenere un elenco ordinato per il numero di occorrenze:

from itertools import groupby 
from operator import itemgetter 

grouped = [(uniq, len(list(dups))) 
      for uniq, dups in groupby(sorted(list1))] # group & count 
grouped.sort(key=itemgetter(1), reverse=True) # sort by occurrence 
list2 = list(map(itemgetter(0), grouped)) 

Se duplicati sono già raggruppato in list1 (come nella tua domanda), quindi è possibile eliminare la chiamata sorted(). groupby() potrebbe essere più efficiente (memoria/tempo) rispetto a collections.Counter() - misurarlo se è importante nel tuo caso.

-1
a= ["one", "two", "two", "three", "four" , "five", "five", "five", "six"] 
dic={} 
for name in a: 
    if name in dic: 
     dic[name]=dic[name]+1 
    else: 
     dic[name]=1 

keyList=[] 
valueList=dic.values() 
valueList.sort() 
valueList.reverse() 

def get_Value(dic,value): 
    for name in dic: 
     if dic[name] == value: 
      del dic[name] 
      return name 


for num in valueList: 
    keyList.append(get_Value(dic,num)) 

print keyList 
Problemi correlati