Sorting on multiple values, some ascending, some descending

Raymond Hettinger python at rcn.com
Wed Jan 3 14:30:53 EST 2007


dwelden wrote:
> I have successfully used the sort lambda construct described in
> http://mail.python.org/pipermail/python-list/2006-April/377443.html.
> However, how do I take it one step further such that some values can be
> sorted ascending and others descending? Easy enough if the sort values
> are numeric (just negate the value), but what about text?
>
> Is the only option to define an external sorting function to loop
> through the list and perform the comparisons one value at a time?

The simplest way is to take advantage of sort-stability and do
successive sorts.  For example, to sort by a primary key ascending and
a secondary key decending:

   L.sort(key=lambda r: r.secondary, reverse=True)
   L.sort(key=lambda r: r.primary)

A less general technique is to transform fields in a way that reverses
their comparison order:

  L.sort(key=lambda r: (-r.age, r.height))    # sorts descending age
and ascending height


Raymond




More information about the Python-list mailing list