【问题标题】:One liner with nested if/else conditions一个带有嵌套 if/else 条件的衬垫
【发布时间】:2020-04-07 01:28:30
【问题描述】:

这里是真正的 python 菜鸟,看到这个嵌套的 if/else 单行器的结果我有点困惑:

>>> num_arr = [5, 10, 15]
>>> [i**2 if i == 10 else i-5 if i < 7 else i+5 for i in num_arr]
[0, 100, 20]

结果不应该是[0, 15, 20],因为 10 大于 7?

【问题讨论】:

  • 测试是从左到右评估的,所以i==10i &lt; 7 之前得到测试
  • 你可以用一对括号来解决这个问题:[(i**2 if i == 10 else i-5) if i &lt; 7 else i+5 for i in num_arr]

标签: python python-3.x if-statement


【解决方案1】:

正如我在 cmets 中提到的,“正确”的版本(注意括号)是:

[(i**2 if i == 10 else i-5) if i < 7 else i+5 for i in num_arr]

您的“问题”源于if 语句的链接,这些语句以英语阅读顺序(从左到右)执行。所以它是这样写的:

[i**2 if i == 10 else (i-5 if i < 7 else i+5) for i in num_arr]
  • 其中i=5,i != 10在“第一个表达式”中,所以你移动到else;其中i &lt; 7,所以你得到i-5,或0
  • i=10i == 10 的位置是i**2100
  • 其中i=15i != 10,所以你移动到else,其中i小于7,所以你得到i+5,或20

From the documentation:

为了使语义非常清晰,列表推导等效于以下 Python 代码:

for expr1 in sequence1:
    for expr2 in sequence2:
    ...
        for exprN in sequenceN:
             if (condition):
                  # Append the value of
                  # the expression to the
                  # resulting list.

这意味着你的看起来像:

[[expr1] if [condition] else [[expr2] if [condition] else [expr3]] for ...]

【讨论】:

  • 放入括号没有任何意义,如果i &lt; 7 那么i == 10 不可能是真的。代码的唯一合理行为是产生[0, 100, 20]
  • @Nick :是的,我把“正确”放在引号中是有原因的。“正确”的意思是“产生所需的输出”[0, 15, 20]
【解决方案2】:

这是一个班轮的扩展版本:

for i in num_arr:
    if i == 10:
        i ** 2
    else:
        if i < 7:
            i - 5
        else:
            i + 5

单行 if 语句基本上是:[action] if [condition] else [action]。换句话说,如果满足所述条件,请执行此操作。否则,请执行此操作。

我不喜欢单行代码的一个原因是因为它们变得不那么 Pythonic。上面的代码比较冗长,但更容易理解。

【讨论】:

    【解决方案3】:

    如果条件为 True 的值在 if 之前,如果 False 的值在 else 之后(参见https://docs.python.org/2.5/whatsnew/pep-308.html)。

    结果是 i-5 for 5 因为 i 不是 10 但它是

    结果是 i ** 2 for 10 因为 i == 10

    结果是 i + 5 for 15 因为 i 不是 10 也不是

    因此 [0, 100, 20]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-25
      • 1970-01-01
      • 2018-07-08
      • 1970-01-01
      相关资源
      最近更新 更多