列表理解的语法差异

时间:2019-05-07 14:52:22

标签: python

我很欣赏这可能是重复的,但是在这里回顾了几个问题之后,我仍然看不到答案。

我使用列表推导从代码中获取语法错误。我有一个列表a,其中包含一些数字,并且正在尝试输出仅包含偶数的新列表。

我要简化的代码是:

/settings

我写的是:

<Router basename="/settings">
    { /* ... */ }
</Router>

但是我在以上几点出现语法错误。

我将理解理解为:

b = [] 
for num in a:
    if num % 2 == 0:
        b.append(num)
print(b)

这有效。

通过阅读文档,我知道您有两种编写列表理解的方法:

evens = [num if num % 2 == 0 for num in a]
                               ^
SyntaxError: invalid syntax

even = [num for num in a if num % 2 ==0]

在第一种情况下怎么了?

3 个答案:

答案 0 :(得分:0)

很简单,如果没有“ else”,则“ if”语句必须放在列表理解的末尾。您可以编写:

A if <condition> else D for B in C

但是你不能写

A if <condition> for B in C

因为没有“ else”。

答案 1 :(得分:0)

对于具有if else的列表理解:

[f(x) if condition else g(x) for x in sequence] # expression1 if condition else expression2 for item in iterable

并且,仅对于具有if条件的列表理解:

[f(x) for x in sequence if condition] # expression for item in iterable if condition

请注意,这实际上使用了一种不同的语言构造,即条件表达式,它本身不是理解语法的一部分,而for ... in之后的if是列表理解的一部分,用于从可迭代的源中筛选元素。

答案 2 :(得分:0)

Python具有某种三元运算符。就是这样:

A if COND else B

它用作整个代码块。此外,列表生成器的主体末尾可以具有if语句,用于过滤值。所以所有这些生成器都是正确的:

[A for ... in very_long_iterator]
[(A if COND else B) for ... in very_long_iterator]
[(A if COND else B) for ... in very_long_iterator if COND2]

()不是必需的,但是它们用于将if-else与generator-if区别开来)

但是您不能在if之前和没有for的情况下使用else,因为它是:

  • 不是“三元”代码块
  • 不是生成器的if语句,因为它在for之前

因此它引发了一个错误。