2012-09-17 11 views
6

Tengo una lista en Python en la que cada elemento es una tupla de esta manera:Max en una lista con dos condiciones

(attr1, attr2, attr3) 

Quiero encontrar la tupla que tiene la mayor attr2, pero que tienen attr3 >= 100.

¿Cuál es el enfoque pitónico de esto?

+2

y lo que la producción habría que esperar si todos los valores tienen 'attR3 <100'? 'max()' levantará un ValueError si recibe una secuencia vacía. –

Respuesta

13

Tienes que tanto filtro y usar un argumento key al máximo:

from operator import itemgetter 

max(filter(lambda a: a[2] >= 100, yourlist), key=itemgetter(1)) 

El filtro también se puede expresar como una expresión generadora:

max((t for t in yourlist if t[2] >= 100), key=itemgetter(1)) 

Demostración:

>>> yourlist = [(1, 2, 300), (2, 3, 400), (3, 6, 50)] 
>>> max((t for t in yourlist if t[2] >= 100), key=itemgetter(1)) 
(2, 3, 400) 
>>> max(filter(lambda a: a[2] >= 100, yourlist), key=itemgetter(1)) 
(2, 3, 400) 

Tenga en cuenta que debido a que filtra, es fácil terminar con una lista vacía para elegir el máximo, por lo que puede que tenga que ponerse ValueError s menos que necesite esa excepción para propagar la pila de llamadas:

try: 
    return max(filter(lambda a: a[2] >= 100, yourlist), key=itemgetter(1)) 
except ValueError: 
    # Return a default 
    return (0, 0, 0) 
+2

sí, el genex es el más pythonic – wim

+1

@wim: 'filter()' encaja muy bien con el patrón funcional 'max()'. Es una cuestión de gusto aquí. –

+0

Creo que la expresión del generador es más clara. – Juho

Cuestiones relacionadas