【问题标题】:Why is else required in if statements when defining a list of items?为什么在定义项目列表时 if 语句中需要 else ?
【发布时间】:2018-08-17 18:03:06
【问题描述】:

在定义项目列表(即不是实际的列表推导)时,为什么需要一个 else 语句来伴随任何 if 语句?例如,使用 Python 3.7 说我们有一些可能为真或假的条件,如果条件为真,我们希望在列表中包含一个元素,如果条件为假,则不包含它。

condition = False
lyst = ['a', 'b', 'c' if condition]

我希望它将 ['a', 'b'] 分配给 lyst,但它会引发语法错误。如果我们包含 else 语句,它会起作用:

lyst = ['a', 'b', 'c' if condition else 'd']

但现在结果是lyst = ['a', 'b', 'd']this question 中,用户 Plankton 的回答进一步指出您不能在 else 语句中使用“通过”。我的问题是为什么需要 else 语句?是否保证创建的列表具有预期的项目数量?如果是这样,我觉得这不是很pythonic。

这特别奇怪,因为您可以在实际列表推导中使用 if 语句而没有 else 语句,例如:

post = [x for x in range(10) if x > 5]
# equivalent to: post = [6, 7, 8, 9]

我意识到列表理解是完全不同的功能。请记住,我的问题是为什么在列表文字中不能使用没有 else 的 if 语句?此限制是否避免了一些我不知道的问题?

【问题讨论】:

  • ['a', 'b', 'c'] 表示法不是列表理解。
  • x if cond else y 在 Python 中是一个表达式。无论条件是真还是假,它都必须有一个值。这就是为什么您必须始终提供替代方案。您将表达式与 if cond: do_somethig 语句混淆了。
  • if condition else 'd' 是一个条件表达式。在某些方面它与理解中允许的if 表达式相似,但并不相同。这两者都不同于if... elif... else 复合语句。
  • 这是一个非常一般性的问题,进入教程级别(题外话)。正如您所发现的,您提到的每种技术的工作方式都不同。何时使用它们完全取决于您当时想要做什么。

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


【解决方案1】:

您将条件表达式 a if b else c 与列表解析的语法混淆了,列表解析需要 for ... in ... 子句可以有一个可选 if (但没有else)。

  1. 表达式

    ['a', 'b', 'c' if condition]
    

    是一个语法错误,因为它不是一个列表解析(不是for),而且c if condition 不是一个有效的表达式(不是else)。

  2. 表达式

    ['a', 'b', 'c' if condition else 'd']
    

    是一个有效的列表文字,由值'a''b''c' if condition else 'd'组成(根据@的值计算为'c''d' 987654335@).

  3. 表达式

    [x for x in range(10) if x > 5]
    

    是一个列表推导式,if x > 5 是一个过滤器,每次您从 range(10) 中获取一个值时,它都会应用于 x 的值。

【讨论】:

    【解决方案2】:

    这与列表理解无关。它纯粹是关于列表,以及如何使用列表文字创建一个。

    列表文字由一个左括号和一个用逗号分隔的表达式列表组成。

    所以在你的情况下,你的 'a' 和 'b' 是表达式(字符串文字)。但是 'c' if condition' 不是表达式。这是一个半支持的 if-STATEMENT(非常不同的野兽)!

    但由于三元运算符(x if c else y)是表达式,您可以使用它们。

    【讨论】:

      【解决方案3】:

      ['a', 'b', 'c' if condition else 'd'] 被解释为['a', 'b', ('c' if condition else 'd')]。这不是列表理解,您只是在创建一个文字列表。

      【讨论】:

        【解决方案4】:

        正如 cmets 中所发布的,您的 sn-p 不是列表理解。您正在创建一个列表,其中一个元素作为表达式。

        condition = False
        list = ['a', 'b', 'c' if condition else None]
        

        使用list = ['a', 'b', 'c' if condition] 的示例(将失败),您不妨执行以下任一操作:

        有条件地添加 c

        condition = False
        list = ['a', 'b']
        if condition:
            list.append('c')
        

        使用列表推导删除 None

        condition = False
        list = ['a', 'b', 'c' if condition else None]
        final_list = [i for i in list if i is not None]
        

        【讨论】:

          【解决方案5】:

          这里有两个单独的语言功能:三元组 (conditional expressions) 和 filtering

          三元:

          x = 1 if 5 == 5 else 2
          #1
          

          过滤:

          l = [1,2,3,4,5]
          l = [i for i in l if i < 3]
          #[1,2,3]
          

          这是您正在使用的仅有的两个语法特征,只是您在列表定义中使用三元组会混淆自己:

          l = [1,2,3 if 5 == 5 else 4]
          

          看看这相当于:

          x = 3 if 5 == 5 else 4
          l = [1,2,x]
          

          【讨论】:

            【解决方案6】:

            这不是列表理解。这是一个包含 3 个值的列表。问题是,您的第三个值是'c' if condition。这在 python 中不是有效的 value 。它与列表无关。你也不能写x = 'c' if condition。另一方面,您在第二个示例中使用的三元 if-else 是一个有效值,这就是它被接受的原因。

            【讨论】:

              【解决方案7】:

              我相信如果您希望您的列表是 ['a', 'b', 'c'] 或 `['a', 'b'] 那么您将 if 语句放在外面,如下所示:

              mylist = ['a', 'b', 'c' if condition else None]
              

              这不是列表推导(上图):在列表推导中,有一些循环和一个 if 充当过滤器。您的代码是一个条件(三元)表达式,必须对其进行评估才能产生结果。

              【讨论】:

              • OP 发布了预期输出:['a', 'b', 'c']['a', 'b'],而您发布的代码没有输出。
              • 您的新编辑现在为condition == False 输出['a', 'b', None]
              • 无论如何,我不认为这个问题真的是 "How do I do X" 而是 "Why can't I use X in这样吗?”
              • 我试图通过提供一些关于列表组合和条件表达式的信息来回答这个问题
              • 确实如此,但是为什么要发布一个甚至没有按照 OP 的要求发布的代码示例呢?
              猜你喜欢
              • 2022-07-16
              • 1970-01-01
              • 2021-12-10
              • 1970-01-01
              • 1970-01-01
              • 2017-10-25
              • 2015-03-13
              • 2019-04-09
              • 2012-09-10
              相关资源
              最近更新 更多