¿Cómo ordenar el contador por valor? - pitón
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)
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, heapq
se 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 key
funció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.
Una adición bastante buena a la respuesta de @MartijnPieters es recuperar un diccionario ordenado por ocurrencia, ya que 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
}
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 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)]
Ordenado más general, donde la 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)]