sorting question

Michael Hoffman at mh391.invalid
Wed Apr 25 23:57:39 CEST 2007

belinda thom wrote:
> Hi,
> I've had a look at, but am not 
> sure if I can get the operator.itemgetter to do what I want for my 
> particular need. I'm also not sure why creating my own cmp for pulling 
> tuple parts out and passing it to a list sort doesn't just work.
> I'm sure this stuff is old hat to many on this list. Suggestions happily 
> accepted.
> Suppose I've got a list like:
>   l = [(-.3,(4,3)),(.2,(5,1)),(.10,(3,2))]
 > and I want to sort on the 2nd item in the 2nd tuple.

sorted(l, key=lambda item: item[1][1])

> I've tried things like:
>   cmp = lambda x,y : x[1][1] > y[1][1]
>   l.sort(cmp=cmp)

Don't call your comparison function cmp. There's already a built-in, 
which is what you should be using:

l.sort(cmp=lambda x, y: cmp(x[1][1], y[1][1]))

cmp returns -1, 0, or 1, but your function only returned 0 or 1.

But using key is better, because the key function has to be run only 
once per item. The comparison has to be run for every comparison--which 
there can be many of if you are sorting a long list.

> but l isn't then changed in place.
> Using
>   sorted(l,operator.itemgetter(1))
> behaves as I'd expect, but I really want something like 
> operator.itemgetter(1).itemgetter(1), which (understandably) causes a 
> syntax error.

Unless you are doing something really weird, it should cause an 
AttributeError, not a SyntaxError.
Michael Hoffman

More information about the Python-list mailing list