Sorting a dictionary by value then key

I can sort by key or value, but I need it sorted by value, then key, in one line. To explain this better I can show you my problem:

dict = {'apple': 2, 'banana': 3, 'almond':2 , 'beetroot': 3, 'peach': 4}

I want my output to be sorted descending by their value and then ascending (A-Z) by their key (alphabetically). Resulting in such a list:

With the output of: ['peach', 'banana', 'beetroot', 'almond', 'apple']

The only way I know how to do it so far is:

[v[0] for v in sorted(dict.items(), key=lambda(k,v): (v,k))]

With the output of: ['almond', 'apple', 'banana', 'beetroot', 'peach']

So it has sorted the values in ascending order and the keys alphabetically in ascending order (A-Z). So if I reverse this:

[v[0] for v in sorted(dict.items(), key=lambda(k,v): (v,k), reverse=True)]

With the output of: ['peach', 'beetroot', 'banana', 'apple', 'almond']

It has sorted the values in descending order and the keys alphabetically in descending order (Z-A).

Is there a way I can sort the values in descending order and the keys in ascending order (i.e. A-Z) and get the output I showed above?

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

You need to take advantage of the fact that the values are numbers.

>>> [v[0] for v in sorted(d.iteritems(), key=lambda(k, v): (-v, k))]
['peach', 'banana', 'beetroot', 'almond', 'apple']

Method 2

To sort by descending value is, for negatable quantities, to sort by ascending negative-of-value.

[v[0] for v in sorted(dict.items(), key=lambda(k,v): (-v,k))]

Method 3

>>> d = {'apple':2, 'banana':3, 'almond':2, 'beetroot':3, 'peach':4}
>>> [k for k, v in sorted(d.iteritems(), key=lambda(k, v): (-v, k))]
['peach', 'banana', 'beetroot', 'almond', 'apple']


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x