sort descending on a[1], ascending on a[0]

Manuel M. Garcia mgarcia at
Fri Oct 11 20:09:59 CEST 2002

On Fri, 11 Oct 2002 07:55:05 GMT, Alex Martelli <aleax at>

>def asc0desc1(a, b):
>    return cmp(a[0],b[0]) or cmp(b[1],a[1])

I forgot about this trick, but I think I might stick with
list1.sort(make_sort_f( [(2,-1),(1,-1),(0,1)] ))
in many situations because changing to different sort orders is
trivial, and with the proper sort I usually can continue working with
a much smaller beginning slice of the list, and of course with a
smaller list the speed up is dramatic for all operations.

>[alex at lancelot alex]$ python2.2 -O
>1 1 1
>3.74 sortAdByMethod
>4.17 sortAdByDSUPasses
>2.74 sortAdByRichDSU
>[alex at lancelot alex]$ python2.3 -O
>True True True
>0.97 sortAdByMethod
>2.75 sortAdByDSUPasses
>1.88 sortAdByRichDSU

>[alex at lancelot alex]$ python2.2 -O
>5.07 sortAdByMethod
>2.90 sortAdDSU
>[alex at lancelot alex]$ python2.3 -O
>1.39 sortAdByMethod
>1.31 sortAdDSU

Hooray for Python 2.3 and Tim Peters's sort()!  I will have to get
used to seeing "True" instead of "1"!

>The complicated approach
>of synthesizing 'decorated strings' whose comparison is the
>reverse than the original's, besides lack of generality (quite
>serious, btw -- it works here, but it will NOT work when two
>strings being compared can have the same prefix but with one 
>longer than the other!), is only a little faster than the simple
>minded "pass a comparison function" in 2.2

Yeah, and the strings I often end up working with are file paths,
which would be the worst case scenario for this technique

More information about the Python-list mailing list