【问题标题】:nested if statements in lambdalambda 中的嵌套 if 语句
【发布时间】:2016-07-18 08:30:01
【问题描述】:

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

我正在尝试使用 lambda 的过滤功能:

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

我想做的是:

  1. 检查值是浮点数还是整数
  2. 如果是 float 或 int,检查是否
  3. 如果 False,因此 filter 将移动到列表的下一个元素。

我的错误表明我的嵌套 if x &lt; 5 语法无效。

【问题讨论】:

  • 那么如果值不是 float 或 int,或者是 5 或更大,应该返回什么?
  • 在这种情况下,我将只使用常规 (def) 函数,使其更易于阅读、测试和理解。
  • @TigerHawk:这实际上不需要条件表达式。
  • 你甚至不需要另一个if:Python 有短路功能。 lambda x: not (isinstance x(float) or isinstance(x, int) and x&lt;5)。如果你有比这更复杂的东西,它不能只返回它自己的真值,请使用三元组。
  • @MartijnPieters,对不起。也许这会解决问题:1)如果不是浮点数或整数,则打印值,2)如果浮点数或整数大于 5,则打印值。我想我误解了过滤器的基本工作原理,并试图编写它,以便它会强制删除不符合标准的值,即使它会自动执行。您在下面回答的方式帮助我清除了错误,以便它现在可以工作。

标签: python if-statement lambda


【解决方案1】:

您不能在 lambda 中使用语句,只能使用表达式。此外,您的isinstance() 调用也是错误的。

在这种情况下,无论如何你只需要一个布尔表达式:

final_list = filter(lambda x: not (isinstance(x, (int, float)) and x < 5), another_list)

如果两个测试都为真,则返回 False,因此 x 是一个数字(整数或浮点数)并且小于 5。True否则返回。这意味着输出中包含不是 int 或float, 为5 或更大的任何值。

如果你反转数字测试(对 5 或更大的数字返回 true),测试变得更具可读性:

final_list = filter(lambda x: not isinstance(x, (int, float)) or x >= 5, another_list)

一般情况下,您可以使用conditional expression;请记住,表达式必须产生一个值。 if 语句不必有 else 分支,但这不会在表达式中执行。在你的情况下,你的 lambda 必须返回一个值来过滤,所以你会使用

True if not isinstance(x, (float, int)) else False if x < 5 else True

isinstance()&lt; 比较运算符都已经产生了布尔结果。

使用单独的函数代替 lambda 可能更容易,在单独的步骤中写出您的条件:

def everything_except_numbers_under_five(obj):
    # allow anything that is not a number
    if not isinstance(obj, (int, float)):
        return True
    # allow only numbers 5 or over
    return obj >= 5

final_list = filter(everything_except_numbers_under_five, another_list)

【讨论】:

  • 哦,我明白了。我想我并没有真正理解过滤器的工作原理。谢谢!
【解决方案2】:

就像 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多