cam.ac.uk at mh391.invalid
Wed Apr 25 23:57:39 CEST 2007
belinda thom wrote:
> I've had a look at http://wiki.python.org/moin/HowTo/Sorting, 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
> 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)
> I've tried things like:
> cmp = lambda x,y : x > y
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, y))
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.
> 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.
More information about the Python-list