belinda thom wrote: > Hi, > > 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 > 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 -- http://mail.python.org/mailman/listinfo/python-list