turtle
turtle

Reputation: 8073

Complex sort with multiple parameters?

I have a list of tuples:

li = [('fink', 3), ('flip', 3), ('flock', 4), ('foo', 12), ('foot', 20), ('football', 20), ('futz', 10), ('flip', 3), ('flank', 3), ('flop', 3)]

How can I sort the list by descent number first and then alphabetically descending? The results would be:

('foot', 20)
('football', 20)
('foo', 12)
('futz', 10)
('flock', 4)
('fink', 3)
('flip', 3)
('flake', 3)
('flop', 3)

from operator import itemgetter

sorted_li = sorted(li, key=itemgetter(1,0), reverse=True)

While the above code sorts by descending number correctly, the words are not sorted alphabetically.

Upvotes: 6

Views: 6190

Answers (3)

Nariman Jafari
Nariman Jafari

Reputation: 60

As Python's sort is stable, it's easiest to sort twice:

sorted_li  = sorted(li, key=itemgetter(0))
sorted_li.sort(key=itemgetter(1), reverse=True)

but attention that you must use your lowest priority order at first , then the others base on the priority. the highest priority order must be the last one. it is the most important thing that you have to consider when you try to use Sorted function.

Upvotes: 0

eumiro
eumiro

Reputation: 212845

This is too complicated for a single itemgetter. Use lambda instead:

sorted_li = sorted(li, key=lambda x: (-x[1], x[0]))

It is about the same speed as two consecutive sorts using itemgetter, but it is less code and probably more readable.

Upvotes: 11

Jon Clements
Jon Clements

Reputation: 142136

As Python's sort is stable, it's easiest to sort twice:

sorted_li  = sorted(li, key=itemgetter(1), reverse=True)
sorted_li.sort(key=itemgetter(0))

Upvotes: 6

Related Questions