Ist es möglich, eine where-Klausel mit Listenverständnis hinzuzufügen?
Beachten Sie das folgende Listenverständnis
[ (x,f(x)) for x in iterable if f(x) ]
Dies filtert das Iterable basierend auf einer Bedingungf
und liefert die Paare vonx,f(x)
. Das Problem bei diesem Ansatz istf(x)
wird doppelt berechnet. Es wäre toll, wenn wir gerne schreiben könnten
[ (x,fx) for x in iterable if fx where fx = f(x) ]
or
[ (x,fx) for x in iterable if fx with f(x) as fx ]
In Python müssen wir jedoch mit verschachtelten Begriffen schreiben, um einen doppelten Aufruf von f (x) zu vermeiden. Dadurch wird das Verständnis weniger klar
[ (x,fx) for x,fx in ( (y,f(y) for y in iterable ) if fx ]
Gibt es eine andere Möglichkeit, es pythonischer und lesbarer zu gestalten?
Aktualisieren
In Kürze in Python 3.8!PEP
# Share a subexpression between a comprehension filter clause and its output
filtered_data = [y for x in data if (y := f(x)) is not None]