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



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



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

    Ничего не найдено.