Як сортувати лічильник за значенням? - пітон


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)

Відповіді:


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 замість усіх значень, a 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 .


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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.