Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Complex sort with multiple parameters?

Tags:

python

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.

like image 351
turtle Avatar asked Jul 12 '12 10:07

turtle


2 Answers

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.

like image 123
eumiro Avatar answered Oct 18 '22 16:10

eumiro


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))
like image 27
Jon Clements Avatar answered Oct 18 '22 16:10

Jon Clements