max() of a list of tuples

Peter Abel p-abel at t-online.de
Tue Jan 21 21:52:20 CET 2003


Terry Hancock <hancock at anansispaceworks.com> wrote in message news:<ygaX9.4400$bL4.431294 at newsread2.prod.itd.earthlink.net>...
> Mario Wehbrink wrote:
> > i have a list of tuples that look like:
> > [(1,3,5), (8,16,2), (2,56,4)]
> > 
> > what i am interested, in is the tuple with the greatest value in pos 3.
> > So in this case it would be (1,3,5). Is there a way to tell
> > max(mylistoftuples) to only look at the last position of the tuples?
> 
> Don't know if this is the most elegant solution, but it does work:
> 
> l = [(1, 3, 5), (8, 16, 2), (2, 56, 4)]
> z = zip(*l)
> z  # prints [(1, 8, 2), (3, 16, 56), (5, 2, 4)]
> l[list(z[2]).index(max(z[2]))]  # prints (1, 3, 5)
> 
> Ugly, but:
> 
> * zip combines sequences into a list of tuples
> * one of these contains the sequence you want to test
> * we find the maximum and what its index in the sequence is
> * we use that to look up the index in the original list
> 
> Maybe someone will have a more elegant solution.
> 
> Cheers,
> Terry

Silly me!!!
The correct code is:
>>> l = [(1, 3, 5), (8, 16, 2), (2, 56, 4)]
>>> reduce(lambda y,x:y[2]>x[2] and y or x,l,(-1.e16,-1.e16,-1.e16))
(1, 3, 5)

And it works also with:
>>> l = [(1, 3, -5), (8, 16, -2), (2, 56, -4)]
>>> reduce(lambda y,x:y[2]>x[2] and y or x,l,(-1.e16,-1.e16,-1.e16))
(8, 16, -2)

Or with:
>> l = [(1, 3, -5), (8, 16, -200), (2, 56, -4)]
>>> reduce(lambda y,x:y[2]>x[2] and y or x,l,(-1.e16,-1.e16,-1.e16))
(2, 56, -4)
>>> 

Sorry
Peter




More information about the Python-list mailing list