I want to call a method and add the returned value to a list only if the value is not None, in place.
Approach 1
list = []
for item in items:
temp = func(item)
if temp is not None:
list.append(temp)
Approach 2
[func(item) for item in items if func(item) is not None]
The first approach is more verbose than I want but accomplishes my goal. The second approach is in place, but requires two calls to func(item). If possible I would like to reuse the first call in a var that I then use in the comparison.
Not proper python but in the vein of what I am looking for
[(a = func(item)) for item in items if a is not None]
This is what the assignment expression, aka the walrus operator,
:=, introduced in Python 3.8, supports:The test precedes the production of a value, so you use the walrus in the condition, not the production expression.
Pre-3.8, you're stuck wrapping a listcomp around a
mapor genexpr:Both of the above are equivalent; the former might be slightly more performant (especially if
funcis a built-in implemented in C), but it's mostly personal preference (I prefermaphere largely because it's concise; if the mapping wasn't a preexisting function though, I'd use the genexpr to avoidmap+lambda, which is the worst).