Подтвердить что ты не робот

Как сортировать счетчик по значению? - python

Кроме того, что вы делаете переписку с понятием перевернутого списка, существует ли способ pythonic сортировать счетчик по значению? Если это так, это быстрее, чем это:

>>> 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)
4b9b3361

Ответ 1

Используйте метод Counter.most_common(), он будет сортировать элементы для вас:

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

Это сделает это наиболее эффективным способом; если вы запрашиваете Top N вместо всех значений, вместо sort > используется heapq:

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

За пределами счетчиков сортировка всегда может быть скорректирована на основе функции key; .sort() и sorted() оба вызываются, что позволяет указать значение для сортировки входной последовательности; sorted(x, key=x.get, reverse=True) даст вам ту же сортировку, что и x.most_common(), но только возвращает ключи, например:

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

или вы можете сортировать только значение, заданное парами (key, value):

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

Для получения дополнительной информации см. Python sorting howto.

Ответ 2

Да:

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

Используя отсортированный ключевой ключ и функцию лямбда:

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

Это работает для всех словарей. Однако Counter имеет специальную функцию, которая уже дает вам отсортированные элементы (от наиболее часто встречающихся до наименее частых). Он назывался 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)]

Вы также можете указать, сколько элементов вы хотите увидеть:

>>> x.most_common(2)  # specify number you want
[('c', 7), ('a', 5)]

Ответ 3

Довольно приятным дополнением к @MartijnPieters является возврат словаря, отсортированного по вхождению, поскольку Collections.most_common возвращает только кортеж. Я часто связываю это с выходом json для удобных файлов журналов:

from collections import Counter, OrderedDict

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

С выходом:

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