Python lambda with if but without else
Question
I was writing some lambda functions and couldn't figure this out. Is there a way to have something like lambda x: x if (x<3)
in python? As lambda a,b: a if (a > b) else b
works ok. So far lambda x: x < 3 and x or None
seems to be the closest i have found.
Solution
A lambda, like any function, must have a return value.
lambda x: x if (x<3)
does not work because it does not specify what to return if not x<3
. By default functions return None
, so you could do
lambda x: x if (x<3) else None
But perhaps what you are looking for is a list comprehension with an if
condition. For example:
In [21]: data = [1, 2, 5, 10, -1]
In [22]: [x for x in data if x < 3]
Out[22]: [1, 2, -1]
OTHER TIPS
What's wrong with lambda x: x if x < 3 else None
?
Sorry to resuscitate a zombie.
I was looking for an answer to the same question, and I found that "filter" provided exactly what I was looking for:
>>> data = [1, 2, 5, 10, -1]
>>> filter(lambda x: x < 3, data)
[1, 2, -1]
The implementation is the same in both 2.x and 3.x: https://docs.python.org/2/library/functions.html#filter https://docs.python.org/3/library/functions.html#filter
You can always try to invoke 'filter' for conditional checks. Fundamentally, map()
has to work on every occurrence of the iterables, so it cannot pick and choose. But filter may help narrow down the choices. For example, I create a list from 1 to 19 but want to create a tuple of squares of only even numbers.
x = list(range(1,20))
y = tuple(map(lambda n: n**2, filter(lambda n: n%2==0,x)))
print (y)