web-dev-qa-db-fra.com

Python lambda avec if mais sans autre

J'écrivais des fonctions lambda et je ne pouvais pas comprendre cela. Existe-t-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 bien. Jusque là lambda x: x < 3 and x or None semble être le plus proche que j'ai trouvé.

33
root

Un lambda, comme toute fonction, doit avoir une valeur de retour.

lambda x: x if (x<3) ne fonctionne pas car il ne spécifie pas quoi renvoyer sinon x<3. Par défaut, les fonctions retournent None, vous pouvez donc faire

lambda x: x if (x<3) else None

Mais peut-être que vous cherchez une compréhension de liste avec une condition if. 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]
54
unutbu

Quel est le problème avec lambda x: x if x < 3 else None?

6
user4815162342

Désolé de ressusciter un zombie.

Je cherchais une réponse à la même question, et j'ai trouvé que le "filtre" fournissait exactement ce que je cherchais:

>>> data = [1, 2, 5, 10, -1]
>>> filter(lambda x: x < 3, data)
[1, 2, -1]

L'implémentation est la même dans les versions 2.x et 3.x: https://docs.python.org/2/library/functions.html#filterhttps: // docs .python.org/3/library/functions.html # filter

4
linuxraptor

Vous pouvez toujours essayer d'appeler "filtre" pour les vérifications conditionnelles. Fondamentalement, map() doit travailler sur chaque occurrence des itérables, donc elle ne peut pas choisir. Mais le filtre peut aider à affiner les choix. Par exemple, je crée une liste de 1 à 19 mais je veux créer un Tuple of carrés de nombres pairs seulement.

x = list(range(1,20))

y = Tuple(map(lambda n: n**2, filter(lambda n: n%2==0,x)))

print (y)
2
Tirtha