在定义项目列表时(即不是实际的列表理解),为什么需要在其他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语句?此限制是否可以避免某些我不知道的问题?
答案 0 :(得分:3)
您正在将条件表达式a if b else c
与列表理解的语法相混淆,列表理解需要一个for ... in ...
子句,该子句可以具有 optional if
(但没有else
)。
表达式
['a', 'b', 'c' if condition]
是语法错误,因为它不是列表推导(否for
),并且c if condition
不是有效的表达式(否else
)。
表达式
['a', 'b', 'c' if condition else 'd']
是有效的列表 literal ,由值'a'
,'b'
和'c' if condition else 'd'
(其值为'c'
或{ {1}}(取决于'd'
的值)。
表达式
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]
(将失败)为例,您还可以执行以下任一操作:
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
作为过滤器。您的代码是一个条件(三元)表达式,必须对其进行求值才能产生结果。