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]

Antworten auf die Frage(4)

Ihre Antwort auf die Frage