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

4 minutos de lectura

avatar de usuario
alvas

Aparte de hacer comprensiones de lista de comprensión de lista invertida, ¿hay alguna forma pitónica de ordenar 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']
>>> ordenado(x.elementos())
[('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()]inverso=Verdadero)]
[('c', 7), ('a', 5), ('b', 3)

user avatar
Martijn Pieters

Use the Counter.most_common() method, it’ll sort the items for you:

>>> 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, un heapq se utiliza en lugar de una ordenación directa:

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

Fuera de los mostradores, la clasificación siempre se puede ajustar en función de un key función; .sort() y sorted() ambos toman callable que le permite especificar un valor en el que 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 devuelve las claves, por ejemplo:

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

o puede ordenar solo el valor dado (key, value) pares:

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

Ver el Cómo clasificar Python para más información.

avatar de usuario
Enganchado

Una buena adición a la respuesta de @MartijnPieters es recuperar un diccionario ordenados por ocurrencia desde Collections.most_common solo 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
}

  • A partir de Python 3.7 (3.6 para CPython) no hay necesidad de OrderedDict más, porque dict ahora mantiene la orden de inserción. Así que es simplemente y = dict(x.most_common())

    -Walter Tross

    30 de diciembre de 2020 a las 22:41


  • @WalterTross Para que quede claro, incluso en Python 3.7+, OrderedDict ofrece una funcionalidad que dict no lo hace, especialmente con respecto a las comparaciones. Por ejemplo, OrderedDict([('a', 1), ('b', 2)]) == OrderedDict([('b', 2), ('a', 1)]) evalúa a False, mientras que {'a': 1, 'b': 2} == {'b': 2, 'a': 1} se evalúa como Verdadero.

    – Flamm

    4 de marzo a las 20:52

avatar de usuario
Rosa Inbar

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 Counter tiene una función especial que ya te da los elementos ordenados (desde el más frecuente hasta el 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)]

  • Otra forma de invertir la ordenación es establecer la función de la tecla en lamda i: -i[1]

    – Steinar Lima

    6 de enero de 2014 a las 14:09


  • se me habia olvidado el .items() que luego me dio TypeError: bad operand type for unary -: 'str'. Es solo que necesitas el items() para que se lea como un par para que k[1] se encuentra como el segundo elemento de cada par que se puede ordenar inversamente con -k[1] porque es un número. no serías capaz de hacer -k[0] ya que k[0] es una cadena.

    – questionto42standswithUkraine

    1 oct 2021 a las 22:04

avatar de usuario
alex costura

Ordenado de forma más general, donde el key palabra 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)]

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad