2012-10-30 9 views

risposta

92

Uso max():


Utilizzando itemgetter():

In [53]: lis=[(101, 153), (255, 827), (361, 961)] 

In [81]: from operator import itemgetter 

In [82]: max(lis,key=itemgetter(1))[0] #faster solution 
Out[82]: 361 

utilizzando lambda:

In [54]: max(lis,key=lambda item:item[1]) 
Out[54]: (361, 961) 

In [55]: max(lis,key=lambda item:item[1])[0] 
Out[55]: 361 

timeit confronto:

In [30]: %timeit max(lis,key=itemgetter(1)) 
1000 loops, best of 3: 232 us per loop 

In [31]: %timeit max(lis,key=lambda item:item[1]) 
1000 loops, best of 3: 556 us per loop 
+4

(+1) sarebbe 'operator.itemgetter (1)' funzionerebbe meglio del lambda in questo caso perché il lambda verrebbe creato per ciascuna delle 10 ** 6 volte. – inspectorG4dget

+0

@ inspectorG4dget stava per pubblicare solo questo. :) –

+0

@AshwiniChaudhary: c'è una notevole differenza di velocità tra 'operator.itemgetter' e' lambda' in questi casi, però? – inspectorG4dget

0

Si potrebbe scorrere la lista e mantenere la tupla in una variabile e quindi si può vedere entrambi i valori della stessa variabile ...

num=(0, 0) 
for item in tuplelist: 
    if item[1]>num[1]: 
    num=item #num has the whole tuple with the highest y value and its x value 
+0

Penso che 'max()' sia molto più semplice. –

+0

@BurhanKhalid Sì, ma è stato pubblicato mentre stavo scrivendo il mio post. Non ci stavo pensando. Lo modificherò per non dirlo più, ma manterrai il mio post solo così c'è un modo alternativo per farlo per i posteri. :) – CoffeeRain

4

Oltre al massimo, è possibile anche ordinare:

>>> lis 
[(101, 153), (255, 827), (361, 961)] 
>>> sorted(lis,key=lambda x: x[1], reverse=True)[0] 
(361, 961) 
+0

Non sta smistando ~ O (n log n) e trovando il massimo O (n)? - È meglio trovare il massimo direttamente –

Problemi correlati