2012-09-17 8 views
6

Ho una lista in Python in cui ogni elemento è una tupla come questo:Max in un elenco con due condizioni

(attr1, attr2, attr3) 

Voglio trovare la tupla che ha il più grande attr2, ma che hanno attr3 >= 100.

Qual è l'approccio pitonico a questo?

+2

e che cosa ci si può aspettare di uscita se tutti i valori hanno 'attr3 <100'? 'max()' solleverà un ValueError se riceve una sequenza vuota. –

risposta

13

si deve sia il filtro e utilizzare un argomento key a max:

from operator import itemgetter 

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

Il filtro può anche essere espresso come un generatore di espressione:

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

Demo:

>>> 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) 

Nota che poiché si filtra, è facile finire con una lista vuota da cui prelevare il massimo, quindi potrebbe essere necessario prendere ValueError s a meno che non è necessario che un'eccezione per propagare lo stack di chiamate:

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

sì, il genex è il più pirolitico – wim

+1

@wim: 'filter()' si adatta molto bene con il modello funzionale 'max()'. È una questione di gusti qui. –

+0

Penso che l'espressione del generatore sia più chiara. – Juho