2012-06-14 14 views
17

In Python 2 (2.7, per essere più precisi), voglio eseguire un'iterazione su un'istanza di collezioni.Counter in ordine di conteggio discendente.Modo Pythonic per iterare su un'istanza collections.Counter() in ordine decrescente?

>>> import collections 
>>> c = collections.Counter() 
>>> c['a'] = 1 
>>> c['b'] = 999 
>>> c 
Counter({'b': 999, 'a': 1}) 
>>> for x in c: 
     print x 
a 
b 

Nell'esempio precedente, risulta che gli elementi sono iterate nell'ordine in cui sono stati aggiunti all'istanza contatore.

Mi piacerebbe scorrere l'elenco dal più alto al più basso. Vedo che la rappresentazione delle stringhe di Counter fa questo, chiedendoci solo se c'è un modo consigliato per farlo.

risposta

20

È possibile scorrere su c.most_common() per ottenere gli articoli nell'ordine desiderato. Vedi anche lo documentation of Counter.most_common().

Esempio:

>>> c = collections.Counter(a=1, b=999) 
>>> c.most_common() 
[('b', 999), ('a', 1)] 
+0

Doh! RTFM. Mi è mancato alla mia prima lettura. Grazie! – Inactivist

1

Il tuo problema è stato risolto solo per restituire ordine discendente ma qui è come farlo genericamente. Nel caso in cui qualcun altro venga qui da Google, ecco come ho dovuto risolverlo. Fondamentalmente ciò che hai sopra restituisce le chiavi per il dizionario all'interno di collections.Counter(). Per ottenere i valori che solo bisogno di passare la chiave al dizionario in questo modo:

for x in c: 
    key = x 
    value = c[key] 

ho avuto un problema più specifico in cui ho avuto conteggio delle parole e volevano filtrare quelli a bassa frequenza. Il trucco qui è quello di creare una copia di collections.Counter() o si otterrà "RuntimeError: dictionary changed size during iteration" quando si tenta di rimuoverli dal dizionario.

for word in words.copy(): 
    # remove small instance words 
    if words[word] <= 3: 
     del words[word] 
2

Ecco l'esempio per iterare il contatore in collezioni Python:

>>>def counterIterator(): 
import collections 
counter = collections.Counter() 
counter.update(('u1','u1')) 
counter.update(('u2','u2')) 
counter.update(('u2','u1')) 
for ele in counter: 
    print(ele,counter[ele]) 
>>>counterIterator() 
u1 3 
u2 3 
Problemi correlati