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

Resuelto alvas asked hace 10 años • 4 respuestas

Además de realizar listas de comprensión de listas invertidas, ¿existe una forma pitónica de ordenar el contador por valor? 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 avatar Jan 06 '14 20:01 alvas
Aceptado

Utilice el Counter.most_common()método , ordenará 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 Top N en lugar de todos los valores, heapqse usa a en lugar de una clasificación directa:

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

Fuera de los contadores, la clasificación siempre se puede ajustar en función de una keyfunción; .sort()y sorted()ambos toman invocables que le permiten especificar un valor sobre el cual ordenar la secuencia de entrada; sorted(x, key=x.get, reverse=True)le daría la misma clasificación que 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 por 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 procedimiento de clasificación de Python para obtener más información.

Martijn Pieters avatar Jan 06 '2014 13:01 Martijn Pieters

Una adición bastante buena 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
}
Hooked avatar Oct 19 '2015 14:10 Hooked

Sí:

>>> 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 proporciona los elementos ordenados (del más frecuente al menos frecuente). 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 avatar Jan 06 '2014 13:01 Inbar Rose

Ordenado más general, donde la keypalabra clave define el método de clasificación, menos antes del tipo numérico indica 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 avatar Oct 21 '2018 09:10 Alex Seam