How to sort a dictionary by value (DESC) then by key (ASC)?

34,605

Something like

In [1]: d = {'banana': 3, 'orange': 5, 'apple': 5}

In [2]: sorted(d.items(), key=lambda x: (-x[1], x[0]))
Out[2]: [('apple', 5), ('orange', 5), ('banana', 3)]
Share:
34,605

Related videos on Youtube

ecr
Author by

ecr

Updated on July 09, 2022

Comments

  • ecr
    ecr almost 2 years

    Just after discovering the amazing sorted(), I became stuck again.

    The problem is I have a dictionary of the form string(key) : integer(value) and I need to sort it in descending order of its integer values, but if two elements where to have same value, then by ascending order of key.

    An example to make it clearer:

    d = {'banana':3, 'orange':5, 'apple':5}
    out: [('apple', 5), ('orange', 5), ('banana', 3)]
    

    After doing some research I arrived at something like:

    sorted(d.items(), key=operator.itemgetter(1,0), reverse=True)
    out: [('orange', 5), ('apple', 5), ('banana', 3)]
    

    This is because it's reverse-sorting both the value and the key. I need the key to be un-reversed.

  • Ananda G
    Ananda G almost 4 years
    This is one of my favorite coding plans for Python script.
  • Malavan
    Malavan almost 3 years
    why -x[1] required ? can you explain that part ?
  • Lev Levitsky
    Lev Levitsky almost 3 years
    @Malavan x[1] would be the dict value. It is negated so that bigger values come before the smaller ones (descending order)