Search code examples
pythonpython-3.xpython-collections

Sort Counter by frequency, then alphabetically in Python


I am trying to use counter to sort letters by occurrence, and put any that have the same frequency into alphabetical order, but I can't get access to the Value of the dictionary that it produces.

letter_count = collections.Counter("alphabet")
print(letter_count)

produces:

Counter({'a': 2, 'l': 1, 't': 1, 'p': 1, 'h': 1, 'e': 1, 'b': 1})

How can I get it ordered by frequency, then by alphabetical order, so everything that shows up only once is in alphabetical order?


Solution

  • It sounds like your question is how to sort the entire list by frequency, then break ties alphabetically. You can sort the entire list like this:

    >>> a = sorted(letter_count.items(), key=lambda item: (-item[1], item[0]))
    >>> print(a)
    # [('a', 2), ('b', 1), ('e', 1), ('h', 1), ('l', 1), ('p', 1), ('t', 1)]
    

    If you want the output to be a dict still, you can convert it into a collections.OrderedDict:

    >>> collections.OrderedDict(a)
    # OrderedDict([('a', 2),
    #              ('b', 1),
    #              ('e', 1),
    #              ('h', 1),
    #              ('l', 1),
    #              ('p', 1),
    #              ('t', 1)])
    

    This preserves the ordering, as you can see. 'a' is first because it's most frequent. Everything else is sorted alphabetically.