Reputation: 177
I am trying to sort a dictionary, the order which I want to follow is that first, the dictionary should be sorted in increasing order by values and if the values for two or more keys are equal then I want to sort the dictionary by the keys in descending order.
Here is the code:
dictionary = {0: 150, 1: 151, 2: 150, 3: 101, 4: 107}
print(sorted(dictionary.items(), key=lambda x: (x[1], x[0])))
I want the output to be the following:
[(3, 101), (4, 107), (2, 150), (0, 150), (1, 151)]
But the output is:
[(3, 101), (4, 107), (0, 150), (2, 150), (1, 151)]
Upvotes: 2
Views: 1333
Reputation: 13079
Because the values are numeric here, you can use negation as having the same effect as reversing the sort order:
sorted(dictionary.items(), key=lambda x: (x[1], -x[0]))
For the more generic case where you can't rely on the values being numeric, here is a possible approach, although there may be a better way.
from functools import cmp_to_key
def cmp(a, b):
# https://stackoverflow.com/a/22490617/13596037
return (a > b) - (a < b)
def cmp_items(a, b):
"""
compare by second item forward, or if they are the same then use first item
in reverse direction (returns -1/0/1)
"""
return cmp(a[1], b[1]) or cmp(b[0], a[0])
dictionary = {0: 150, 1: 151, 2: 150, 3: 101, 4: 107}
print(sorted(dictionary.items(), key=cmp_to_key(cmp_items)))
Upvotes: 1