In Python 2.6 oder neuer:
Wenn Sie ausgelöst StopIteration
werden möchten , wenn kein passendes Element gefunden wird:
next(x for x in the_iterable if x > 3)
Wenn Sie möchten, dass default_value
(z. B. None
) zurückgegeben wird:
next((x for x in the_iterable if x > 3), default_value)
Beachten Sie, dass Sie in diesem Fall ein zusätzliches Klammerpaar um den Generatorausdruck benötigen - diese werden immer dann benötigt, wenn der Generatorausdruck nicht das einzige Argument ist.
Ich sehe, dass die meisten Antworten die next
integrierten Antworten entschlossen ignorieren, und gehe daher aus mysteriösen Gründen davon aus, dass sie sich zu 100% auf Versionen 2.5 und älter konzentrieren - ohne das Problem mit der Python-Version zu erwähnen (aber dann sehe ich diese Erwähnung nicht in die Antworten, die das Eingebaute erwähnen next
, weshalb ich es für notwendig hielt, selbst eine Antwort zu geben - zumindest das Problem der "richtigen Version" wird auf diese Weise aufgezeichnet ;-).
In 2.5 wird die .next()
Methode der Iteratoren sofort ausgelöst, StopIteration
wenn der Iterator sofort beendet ist - dh für Ihren Anwendungsfall, wenn kein Element in der Iterierbarkeit die Bedingung erfüllt. Wenn Sie kümmern sich nicht (dh, wissen Sie , es muss mindestens ein zufriedenstellendes Element sein) , dann benutzen Sie einfach .next()
(am besten auf einem genexp, Linie für die next
Einbau-in Python 2.6 und besser).
Wenn Sie sich darum kümmern, scheint es am besten, Dinge in eine Funktion zu verpacken, wie Sie sie zuerst in Ihrem Q angegeben haben, und obwohl die von Ihnen vorgeschlagene Funktionsimplementierung in Ordnung ist, können Sie alternativ itertools
eine for...: break
Schleife oder einen Genexp oder a try/except StopIteration
als Funktionskörper verwenden , wie verschiedene Antworten vorschlugen. In keiner dieser Alternativen steckt viel Mehrwert, daher würde ich mich für die sehr einfache Version entscheiden, die Sie zuerst vorgeschlagen haben.