¿Cómo ordenar el contador por valor? - pitón

145

Aparte de hacer comprensiones de listas de comprensión de listas invertidas, ¿hay una manera pitónica de ordenar Counter by value? Si es así, es más rápido que esto:

>>> from collections import Counter
>>> x = Counter({'a':5, 'b':3, 'c':7})
>>> sorted(x)
['a', 'b', 'c']
>>> sorted(x.items())
[('a', 5), ('b', 3), ('c', 7)]
>>> [(l,k) for k,l in sorted([(j,i) for i,j in x.items()])]
[('b', 3), ('a', 5), ('c', 7)]
>>> [(l,k) for k,l in sorted([(j,i) for i,j in x.items()], reverse=True)]
[('c', 7), ('a', 5), ('b', 3)
alvas
fuente

Respuestas:

251

Use el Counter.most_common()método , clasificará los elementos por usted :

>>> from collections import Counter
>>> x = Counter({'a':5, 'b':3, 'c':7})
>>> x.most_common()
[('c', 7), ('a', 5), ('b', 3)]

Lo hará de la manera más eficiente posible; si solicita un N superior en lugar de todos los valores, heapqse utiliza a en lugar de una ordenación directa:

>>> x.most_common(1)
[('c', 7)]

Fuera de los contadores, la clasificación siempre se puede ajustar en keyfunción de una función; .sort()y sorted()ambos toman invocables que le permiten especificar un valor para ordenar la secuencia de entrada; sorted(x, key=x.get, reverse=True)le daría la misma clasificación x.most_common(), pero solo devolvería las claves, por ejemplo:

>>> sorted(x, key=x.get, reverse=True)
['c', 'a', 'b']

o puede ordenar solo los (key, value)pares de valores dados :

>>> sorted(x.items(), key=lambda pair: pair[1], reverse=True)
[('c', 7), ('a', 5), ('b', 3)]

Consulte el Cómo de clasificación de Python para obtener más información.

Martijn Pieters
fuente
30

Una adición bastante agradable a la respuesta de @MartijnPieters es recuperar un diccionario ordenado por ocurrencia, ya que Collections.most_commonsolo devuelve una tupla. A menudo combino esto con una salida json para archivos de registro útiles:

from collections import Counter, OrderedDict

x = Counter({'a':5, 'b':3, 'c':7})
y = OrderedDict(x.most_common())

Con la salida:

OrderedDict([('c', 7), ('a', 5), ('b', 3)])
{
  "c": 7, 
  "a": 5, 
  "b": 3
}
Enganchado
fuente
10

Si:

>>> from collections import Counter
>>> x = Counter({'a':5, 'b':3, 'c':7})

Usando la clave de palabra clave ordenada y una función lambda:

>>> sorted(x.items(), key=lambda i: i[1])
[('b', 3), ('a', 5), ('c', 7)]
>>> sorted(x.items(), key=lambda i: i[1], reverse=True)
[('c', 7), ('a', 5), ('b', 3)]

Esto funciona para todos los diccionarios. Sin embargo, Countertiene una función especial que ya le brinda los elementos ordenados (desde los más frecuentes hasta los menos frecuentes). Se llama most_common():

>>> x.most_common()
[('c', 7), ('a', 5), ('b', 3)]
>>> list(reversed(x.most_common()))  # in order of least to most
[('b', 3), ('a', 5), ('c', 7)]

También puede especificar cuántos elementos desea ver:

>>> x.most_common(2)  # specify number you want
[('c', 7), ('a', 5)]
Inbar Rose
fuente
Otra forma de revertir la clasificación es establecer la función de la tecla enlamda i: -i[1]
Steinar Lima
4

Ordenado de manera más general, donde la keypalabra clave define el método de clasificación, menos antes de que el tipo numérico indique descendente:

>>> x = Counter({'a':5, 'b':3, 'c':7})
>>> sorted(x.items(), key=lambda k: -k[1])  # Ascending
[('c', 7), ('a', 5), ('b', 3)]
Alex Seam
fuente
2
La keypalabra clave define el método de clasificación, menos antes de que el tipo numérico indique descendente
Alex Seam