2012-06-14 7 views
17

En Python 2 (2.7, para ser más precisos), quiero iterar sobre una instancia collections.Counter en orden de conteo descendente.Manera pitónica de iterar sobre una instancia de collections.Counter() en orden descendente?

>>> 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 

En el ejemplo anterior, parece que los elementos son iterados en el orden en que se añadieron a la instancia de contador.

Me gustaría iterar sobre la lista de mayor a menor. Veo que la representación de cadena de Counter hace esto, solo me pregunto si hay una forma recomendada de hacerlo.

Respuesta

20

Puede iterar sobre c.most_common() para obtener los elementos en el orden deseado. Vea también el documentation of Counter.most_common().

Ejemplo:

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

Doh! RTFM. Me lo perdí en mi primera lectura. ¡Gracias! – Inactivist

1

Su problema fue resuelto por sólo volviendo orden descendente, pero aquí es cómo hacerlo de forma genérica. En caso de que alguien más venga desde Google aquí, es cómo tuve que resolverlo. Básicamente, lo que tienes arriba devuelve las claves para el diccionario dentro de collections.Counter(). Para obtener los valores sólo tiene que pasar la llave de vuelta al diccionario de este modo:

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

que tenía un problema más específico donde tenía recuentos de palabras y quería para filtrar las frecuencias bajas. El truco aquí es hacer una copia de las colecciones. Contador() o obtendrá "RuntimeError: el tamaño del diccionario cambiado durante la iteración" cuando intente eliminarlos del diccionario.

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

Aquí está el ejemplo de iterar el contador en colecciones de 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 
Cuestiones relacionadas