Lambda de Python com se, mas sem mais
Pergunta
Eu estava escrevendo algumas funções lambda e não conseguia entender isso.Existe uma maneira de ter algo como lambda x: x if (x<3)
em python?Como lambda a,b: a if (a > b) else b
funciona ok.Tão longe lambda x: x < 3 and x or None
parece ser o mais próximo que eu encontrei.
Solução
Um lambda, como qualquer função, deve ter um valor de retorno.
lambda x: x if (x<3)
não funciona porque ele não especifica o que o retorno se não x<3
.Por padrão, funções de retorno None
, assim que você poderia fazer
lambda x: x if (x<3) else None
Mas talvez o que você está procurando está uma lista de compreensão com um if
condição.Por exemplo:
In [21]: data = [1, 2, 5, 10, -1]
In [22]: [x for x in data if x < 3]
Out[22]: [1, 2, -1]
Outras dicas
O que há de errado com lambda x: x if x < 3 else None
?
Desculpe ressuscitar um zumbi.
Eu estava procurando uma resposta para a mesma questão, e achei que o "filtro" proporcionou exatamente o que eu estava procurando:
>>> data = [1, 2, 5, 10, -1]
>>> filter(lambda x: x < 3, data)
[1, 2, -1]
A implementação é a mesma em ambos os 2.x e 3.x:https://docs.python.org/2/library/functions.html#filter https://docs.python.org/3/library/functions.html#filter
Você pode sempre tentar chamar 'filtro' para condicional verifica.Fundamentalmente, map()
tem que trabalhar em cada ocorrência da iterables, por isso não é possível escolher.Mas o filtro pode ajudar a restringir as escolhas.Por exemplo, vou criar uma lista de 1 a 19, mas pretende criar uma tupla de praças de apenas números.
x = list(range(1,20))
y = tuple(map(lambda n: n**2, filter(lambda n: n%2==0,x)))
print (y)