Как отсортировать по значению? - питон
кроме выполнения списка понимания обратного списка, есть ли питонический способ сортировки счетчика по значению? Если да, то это быстрее, чем это:
>>> 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)
3 ответов:
использовать
Counter.most_common()метод, все элементы для вас:>>> from collections import Counter >>> x = Counter({'a':5, 'b':3, 'c':7}) >>> x.most_common() [('c', 7), ('a', 5), ('b', 3)]это будет сделано самым эффективным образом; если вы попросите верхний N вместо всех значений, a
heapqиспользуется вместо прямого вида:>>> x.most_common(1) [('c', 7)]вне счетчиков, сортировка всегда может быть скорректирована на основе
довольно приятное дополнение к @MartijnPieters ответ, чтобы получить обратно a словарь сортировка по вхождению с
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 }
да:
>>> from collections import Counter >>> x = Counter({'a':5, 'b':3, 'c':7})С помощью отсортированного ключевого слова key и лямбда-функции:
>>> 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)]
Comments