使用if语句列表理解(或单行)

时间:2012-12-04 22:19:41

标签: python if-statement list-comprehension

在python中,对于iterables,可以构造许多单行迭代命令。

对于某些此类迭代,如果需要if语句。

有时if语句和for语句的顺序很重要。 假设我想找到0到10之间的奇数之和:

>>> sum(i if not i%2==0 for i in range(10))
SyntaxError: invalid syntax
>>> sum(i for i in range(10) if not i%2==0)
25

这些单行本身并不是很容易理解,但是我真的不明白为什么if语句必须在之后声明。使用之前的i if not i%2==0 for i in range(10)

是否更符合常识?

2 个答案:

答案 0 :(得分:5)

在生成器表达式(或列表推导)中,应该列出语句,就像嵌套它们一样。

您的sum()表达式可以嵌套为:

for i in range(10):
    if not i%2 == 0:
        # do something with i

您无法更改该顺序,因为i未定义,所以以下内容没有意义:

if not i%2 == 0:
    for i in range(10):
        # do something with i

答案 1 :(得分:1)

在第一个示例中,您有一个无条件循环,其中if-expression作为列表理解值。正确的语法是:

(a if b else c for i in iterable)
 \___________/
    |
   actual expression
如果a if b else c评估为true,则

a相当于b,否则为c

在第二个示例中,您有一个条件列表理解。您基本上是从可迭代中跳过值;或者更确切地说,您正在指定采取的措施:

(a for i in iterable if <condition>)

如果是总和,您可以使用第一种语法重写列表推导,因为零是添加的空元素(因此总和):

sum(i if i % 2 != 0 else 0 for i in range(10))