Python lambda avec si mais sans le reste
Question
J'ai écrit quelques lambda fonctions et ne pouvait pas comprendre cela.Est-il un moyen d'avoir quelque chose comme lambda x: x if (x<3)
en python?Comme lambda a,b: a if (a > b) else b
fonctionne ok.Jusqu'à présent lambda x: x < 3 and x or None
semble être le plus proche que j'ai trouvé.
La solution
Un lambda, comme n'importe quelle fonction doit retourner une valeur.
lambda x: x if (x<3)
ne fonctionne pas car il ne précise pas de quoi retourner si ce n' x<3
.Par défaut, les fonctions de retour None
, de sorte que vous pourriez faire
lambda x: x if (x<3) else None
Mais peut-être que vous êtes à la recherche d'une compréhension de liste avec un if
condition.Par exemple:
In [21]: data = [1, 2, 5, 10, -1]
In [22]: [x for x in data if x < 3]
Out[22]: [1, 2, -1]
Autres conseils
Quel est le problème avec lambda x: x if x < 3 else None
?
Désolé pour le réanimer un zombie.
Je cherchais une réponse à la même question, et j'ai trouvé que "filtre" apporté exactement ce que je cherchais:
>>> data = [1, 2, 5, 10, -1]
>>> filter(lambda x: x < 3, data)
[1, 2, -1]
La mise en œuvre est la même dans les deux 2.x et 3.x:https://docs.python.org/2/library/functions.html#filter https://docs.python.org/3/library/functions.html#filter
Vous pouvez toujours essayer de les appeler "filtre" pour les conditionnelle des contrôles.Fondamentalement, map()
à chaque occurrence de l'iterables, de sorte qu'il ne peut pas choisir.Mais le filtre peut aider à affiner le choix.Par exemple, j'ai créer une liste de 1 à 19 et souhaitez créer un tuple de les places de seulement un nombre pair.
x = list(range(1,20))
y = tuple(map(lambda n: n**2, filter(lambda n: n%2==0,x)))
print (y)