2012-10-30 16 views

Odpowiedz

92

Zastosowanie max():


Korzystanie 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 

użyciu 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 porównanie:

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) "operator.itemgetter (1)" działałby lepiej niż lambda w tym przypadku, ponieważ lambda zostałaby utworzona dla każdego z 10 ** 6 razy. – inspectorG4dget

+0

@ inspectorG4dget miał zamiar opublikować tylko to. :) –

+0

@AshwiniChaudhary: czy w takich przypadkach występuje znaczna różnica prędkości między 'operator.itemgetter' a' lambda'? – inspectorG4dget

0

Mogłabyś pętli listy i utrzymać krotki w zmiennej, a następnie można zobaczyć obie wartości z tej samej zmiennej ...

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

Myślę, że 'max()' jest o wiele łatwiejsze. –

+0

@BurhanKhalid Tak, ale zostało to zaksięgowane podczas pisania mojego posta. Nie myślałem o tym. Zmienię to, by już o tym nie mówić, ale zachowaj mój post tylko dlatego, że jest inny sposób na zrobienie tego dla potomności. :) – CoffeeRain

4

Oprócz max można również sortowania:

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

Nie sortuje ~ O (n log n) i znajduje maks. O (n)? - Lepiej jest znaleźć maksimum bezpośrednio –

Powiązane problemy