无法在列表理解中的for循环之前使用if语句

时间:2019-11-30 10:33:47

标签: python python-3.x list loops

my_list = []
for x in range(1,50):
    if x%3==0:
        my_list.append(x)
    else:
        pass
print(my_list)
[x for x in range(1,50) if x%3==0]

上面提到的两个代码都可以正常工作。但是下面的代码给了我错误。

[x if x%3==0 else pass for x in range(1,50)]

Error:
File "", line 1
    [x if x%3==0 else pass for x in range(1,50)]
                         ^
SyntaxError: invalid syntax
  

但是根据列表理解的语法,如果我们在“ for”之前使用“ if”,那么它应该是完整的“ if-else”语句

据我所知,所有3个代码应产生相同的输出。谁能帮助我了解为什么会出现此错误?

我尝试在Python-3.7.4版本中执行此代码。

谢谢。

1 个答案:

答案 0 :(得分:0)

pass是一个语句,而不是表达式,因此您不能在列表推导中使用它。

您注意到,您的第一个版本运行良好,并且是在理解中筛选列表的正确方法,因此,我不确定您为什么要使用错误的语法。

更明确地说,如果要用有效的表达式替换pass,例如:

[x if x%3==0 else 0 for x in range(1,50)]

那么这不会引发任何错误。它根本无法满足我的要求,因为所有3的非整数都将变为0,而不是被排除在外。但这就是列表推导(和mapfilter等效)的工作方式:[expr(x) for x in lst]形式的内容将始终与lst相同,并且在为了使用if语句进行过滤,您需要在if之后for子句,如第一个示例所示。