你应该如何在lambda函数中编写嵌套的if语句?
我正在尝试使用lambda的过滤函数:
final_list = filter(lambda x: False if isinstance x(float) or isinstance(x, int) if x<5, another_list)
我要做的是:
False
,以便filter
转到列表的下一个元素。我的错误说我的嵌套if x < 5
语法无效。
答案 0 :(得分:3)
您不能在lambda中使用语句,只能使用表达式。此外,您的isinstance()
来电也是错误的。
在这种情况下,您只需要一个布尔表达式:
final_list = filter(lambda x: not (isinstance(x, (int, float)) and x < 5), another_list)
如果两个测试均为真,则此'仅返回False,因此x
是一个数字(整数或浮点数)且小于5。{否则返回{1}}。这意味着输出中包含不 int或float,或为5或更大的任何值。
如果您反转数字测试(对于数字5或更高的数字返回true),测试会变得更具可读性:
True
在一般情况下,您可以使用conditional expression;请记住表达式必须生成一个值。 final_list = filter(lambda x: not isinstance(x, (int, float)) or x >= 5, another_list)
语句不必具有if
分支,但在表达式中不会这样做。在您的情况下,else
必须返回一个值来过滤,因此您需要使用
lambda
但是True if not isinstance(x, (float, int)) else False if x < 5 else True
和isinstance()
比较运算符都已经产生了布尔结果。
代替lambda,可能更容易使用单独的函数,以分别的步骤写出你的条件:
<
答案 1 :(得分:0)
就像Martijn所说,在这个具体的例子中,你可以将你想要的东西放入lambda函数中。但是,如果将来要创建一个条件不适合lambda函数的过滤器,可以创建一个单独的函数并将其作为参数传递给filter
。尝试这样的事情:
def filter_funct(x):
if isinstance(x, (int, float)) and x < 5:
return False
# Plenty of space for more if or elif statements!
return True
final_list = filter(filter_funct, another_list)