Python-Lambda mit if, aber ohne else
Frage
Ich habe einige Lambda-Funktionen geschrieben und konnte das nicht herausfinden.Gibt es eine Möglichkeit, so etwas zu haben? lambda x: x if (x<3)
in Python?Als lambda a,b: a if (a > b) else b
funktioniert ok.Bis jetzt lambda x: x < 3 and x or None
Scheint das nächstgelegene zu sein, was ich gefunden habe.
Lösung
Ein Lambda muss wie jede Funktion einen Rückgabewert haben.
lambda x: x if (x<3)
funktioniert nicht, da nicht angegeben wird, was zurückgegeben werden soll, wenn nicht x<3
.Standardmäßig kehren Funktionen zurück None
, also könntest du es tun
lambda x: x if (x<3) else None
Aber vielleicht suchen Sie nach einem Listenverständnis mit einem if
Zustand.Zum Beispiel:
In [21]: data = [1, 2, 5, 10, -1]
In [22]: [x for x in data if x < 3]
Out[22]: [1, 2, -1]
Andere Tipps
Was ist falsch mit lambda x: x if x < 3 else None
?
Tut mir leid, einen Zombie wiederbeleben zu müssen.
Ich suchte nach einer Antwort auf dieselbe Frage und fand, dass „Filter“ genau das lieferte, was ich suchte:
>>> data = [1, 2, 5, 10, -1]
>>> filter(lambda x: x < 3, data)
[1, 2, -1]
Die Implementierung ist in 2.x und 3.x gleich:https://docs.python.org/2/library/functions.html#filter https://docs.python.org/3/library/functions.html#filter
Sie können jederzeit versuchen, „Filter“ für bedingte Prüfungen aufzurufen.Grundsätzlich gilt: map()
muss an jedem Vorkommen der Iterables arbeiten, kann also nicht auswählen.Der Filter kann jedoch dabei helfen, die Auswahl einzugrenzen.Ich erstelle beispielsweise eine Liste von 1 bis 19, möchte aber ein Tupel erstellen von Quadrate nur aus geraden Zahlen.
x = list(range(1,20))
y = tuple(map(lambda n: n**2, filter(lambda n: n%2==0,x)))
print (y)