为什么在定义项目列表时if语句中需要其他?

时间:2018-08-17 18:03:06

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

在定义项目列表时(即不是实际的列表理解),为什么需要在其他if语句中附加else语句?例如,使用Python 3.7表示我们有一些条件可以是true或false,如果条件为true,我们希望在列表中包含一个元素,如果条件为false,则不包括它。

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

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

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

但是现在的结果是lyst = ['a', 'b', 'd']this question中,用户Plankton的答案进一步指定了您不能在else语句中使用“ pass”。我的问题是为什么 else语句是必需的?这样可以确保所创建的列表具有预期的项目数吗?如果是这样,这让我觉得不是很pythonic。

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

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

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

7 个答案:

答案 0 :(得分:3)

您正在将条件表达式a if b else c与列表理解的语法相混淆,列表理解需要一个for ... in ...子句,该子句可以具有 optional if(但没有else)。

  1. 表达式

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

    是语法错误,因为它不是列表推导(否for),并且c if condition不是有效的表达式(否else)。

  2. 表达式

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

    是有效的列表 literal ,由值'a''b''c' if condition else 'd'(其值为'c'或{ {1}}(取决于'd'的值)。

  3. 表达式

    condition

    是一个列表推导,[x for x in range(10) if x > 5] 是每次您从if x > 5取值时应用于x值的过滤器。

答案 1 :(得分:1)

这与列表理解无关。这完全是关于列表,以及如何使用列表文字创建列表。

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

因此,在您的情况下,您的'a'和'b'是表达式(字符串文字)。但是,“ c”(如果条件)不是表达式。这是一半支持的if-STATEMENT(与众不同的野兽)!

但是由于三元运算符(如果为c则为y,则为x)是表达式,因此可以使用它们。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

如评论中所述,您的代码段不是列表理解。您正在创建一个以其中一个元素为表达式的列表。

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]

答案 4 :(得分:0)

这里有两种独立的语言功能:三元(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]

答案 5 :(得分:0)

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

答案 6 :(得分:-2)

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

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

这不是列表理解(上面):在列表理解中,有一些循环和一个if作为过滤器。您的代码是一个条件(三元)表达式,必须对其进行求值才能产生结果。