2013-06-06 13 views
9

Szukałem eleganckiego (krótkiego!) Sposobu na zwrócenie pierwszego elementu listy, który pasuje do określonych kryteriów, bez konieczności oceny kryteriów dla każdego elementu lista. W końcu wymyśliłem:Znajdowanie pierwszego elementu listy, dla którego warunek jest prawdziwy

(e for e in mylist if my_criteria(e)).next() 

Czy jest lepszy sposób to zrobić?

Mówiąc dokładniej: jest wbudowany w funkcje Pythona, takie jak all() i any() - czy nie byłoby sensu mieć coś takiego jak first() też? Z jakiegoś powodu nie podoba mi się połączenie z next() w moim rozwiązaniu.

+3

pokrewne: http://stackoverflow.com/questions/2361426/what-is-the-best-way-to-get-the-first-item-from-an-iterable -matching-a-condition –

+0

Dlaczego wszystko musi być eleganckim jednym wkładem? Utwórz funkcję o znaczącej nazwie i zrób z nią. –

+1

W pythonie nie ma funkcji 'first', ale łatwo jest napisać:' ​​first = next';) – georg

Odpowiedz

7

Nope - wygląda dobrze. Byłbym skłonny do ponownego zapisu możliwie jak:

from itertools import ifilter 
next(ifilter(my_criteria, e)) 

Albo przynajmniej wyrwać obliczeń w generatorze, a następnie użyć tego:

blah = (my_function(e) for e in whatever) 
next(blah) # possibly use a default value 

Innym podejściem, jeśli nie podoba next:

from itertools import islice 
val, = islice(blah, 1) 

to da ci ValueError jako wyjątek, jeśli jest "pusta"

+0

Dla kogoś, kto widzi to dla Pythona 3, 'itertools.ifilter' jest teraz po prostu' filtrem' i jest dostępny w wersji globalnej przestrzeń nazw. –

8

Jak o:

next((e for e in mylist if my_criteria(e)), None) 
1

proponuję użyć

next((e for e in mylist if my_criteria(e)), None) 

lub

next(ifilter(my_criteria, mylist), None) 
0

z pętli

lst = [False,'a',9,3.0] 
for x in lst: 
    if(isinstance(x,float)): 
     res = x 
     break 

print res 
Powiązane problemy