# sorting – How to sort Counter by value? – python

## sorting – How to sort Counter by value? – python

Use the `Counter.most_common()` method, itll sort the items for you:

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

Itll do so in the most efficient manner possible; if you ask for a Top N instead of all values, a `heapq` is used instead of a straight sort:

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

Outside of counters, sorting can always be adjusted based on a `key` function; `.sort()` and `sorted()` both take callable that lets you specify a value on which to sort the input sequence; `sorted(x, key=x.get, reverse=True)` would give you the same sorting as `x.most_common()`, but only return the keys, for example:

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

or you can sort on only the value given `(key, value)` pairs:

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

A rather nice addition to @MartijnPieters answer is to get back a dictionary sorted by occurrence since `Collections.most_common` only returns a tuple. I often couple this with a json output for handy log files:

``````from collections import Counter, OrderedDict

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

With the output:

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

#### sorting – How to sort Counter by value? – python

Yes:

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

Using the sorted keyword key and a lambda function:

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

This works for all dictionaries. However `Counter` has a special function which already gives you the sorted items (from most frequent, to least frequent). Its called `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)]
``````

You can also specify how many items you want to see:

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