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

145

Помимо выполнения списочного понимания обратного списка, есть ли питонный способ сортировки счетчика по значению? Если так, это быстрее чем это:

>>> 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
источник

Ответы:

251

Используйте 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 вместо всех значений, heapqвместо прямой сортировки используется a:

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

Вне счетчиков сортировку всегда можно настроить в зависимости от keyфункции; .sort()и sorted()оба принимают callable, который позволяет вам указать значение, по которому нужно отсортировать входную последовательность; 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 .

Мартейн Питерс
источник
30

Довольно приятное дополнение к ответу @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
}
Увлеченные
источник
10

Да:

>>> 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)]
Инбар Роуз
источник
Другой способ обратной сортировки - установить ключевую функцию наlamda i: -i[1]
Steinar Lima
4

Более общая сортировка, где keyключевое слово определяет метод сортировки, минус перед числовым типом означает убывание:

>>> x = Counter({'a':5, 'b':3, 'c':7})
>>> sorted(x.items(), key=lambda k: -k[1])  # Ascending
[('c', 7), ('a', 5), ('b', 3)]
Алекс Шов
источник
2
keyКлючевое слово определяет метод сортировки, минус перед тем числового типа указывают на нисходящий
Alex Seam