在lambda中嵌套if语句

时间:2016-07-18 08:30:01

标签: python if-statement lambda

你应该如何在lambda函数中编写嵌套的if语句?

我正在尝试使用lambda的过滤函数:

final_list = filter(lambda x: False if isinstance x(float) or isinstance(x, int) if x<5, another_list)

我要做的是:

  1. 检查值是float还是int
  2. 如果是float或int,请检查&lt; 5
  3. 如果&lt; 5,返回False,以便filter转到列表的下一个元素。
  4. 我的错误说我的嵌套if x < 5语法无效。

2 个答案:

答案 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)