2013-01-10 19 views
16

Mam listę obiektów i chciałbym znaleźć pierwszy, dla którego danej metody zwraca wartość true dla niektórych wartości wejściowych. Jest to stosunkowo łatwe do zrobienia w Pythonie:Wartość domyślna następnego elementu w iteratorze Pythona, jeśli iterator jest pusty?

pattern = next(p for p in pattern_list if p.method(input)) 

Jednak w mojej aplikacji jest powszechne, że nie ma takiego p dla których p.method(input) jest prawdą, a więc będzie podnieść StopIteration wyjątek. Czy istnieje idiomatyczny sposób radzenia sobie z tym bez pisania bloku try/catch?

W szczególności wydaje się, że byłoby czystsze obsługiwać tę sprawę z czegoś jak if pattern is not None warunkowy, więc zastanawiam się, czy istnieje sposób, aby rozwinąć moją definicję pattern dostarczenie wartości None gdy iterator jest pusty - lub jeśli istnieje bardziej Pythonowy sposób radzenia sobie z ogólnym problemem!

Odpowiedz

29

next przyjmuje wartość domyślną:

next(...) 
    next(iterator[, default]) 

    Return the next item from the iterator. If default is given and the iterator 
    is exhausted, it is returned instead of raising StopIteration. 

i tak

>>> print next(i for i in range(10) if i**2 == 9) 
3 
>>> print next(i for i in range(10) if i**2 == 17) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
StopIteration 
>>> print next((i for i in range(10) if i**2 == 17), None) 
None 

Zauważ, że musisz zawinąć genexp w dodatkowych nawiasach ze względów składniowych, w przeciwnym razie:

>>> print next(i for i in range(10) if i**2 == 17, None) 
    File "<stdin>", line 1 
SyntaxError: Generator expression must be parenthesized if not sole argument 
+0

O Boże! Tak właśnie miałem nadzieję. Dziękuję Ci. –

Powiązane problemy