如何在 python 中评估列表推导式以及以什么顺序

blu*_*ggy 2 python list-comprehension

我有两个列表推导式,其中条件在不同的地方定义。

>>> [ x**2 if x%2==0 else x**3 if x%3==0 else 0 for x in range(10)]
[0, 0, 4, 27, 16, 0, 36, 0, 64, 729]

>>> [ x**2 if x%2==0 for x in range(10) ]
  File "<stdin>", line 1
    [ x**2 if x%2==0 for x in range(10) ]
                       ^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)

但是,如果我这样做:

>>> [ x**2 for x in range(10) if x%2==0 ]
[0, 4, 16, 36, 64]
>>> 
Run Code Online (Sandbox Code Playgroud)

有用。

现在令人困惑的部分是如何评估订单。有什么不同?

Kar*_*tel 5

你在这里混淆了两个不同的概念。

表达式 likex**2 if x%2==0 else x**3条件表达式。他们可以链接,但是else不是可选的-因为这是一个自包含的表达式计算结果为一个单一的,特定的值。将else x**3是必需的,因为Python有知道该表达式的值时,它是不是该案件x % 2 == 0

列表推导式中,当您编写诸如 之类的内容时[x**2 for x in range(10) if x%2==0],该if子句用于过滤x找到的值in range(10)for计算结果列表中的哪些元素。这里else不允许,因为目的完全不同。

您可以混合搭配:[x**2 if x%2 == 0 else x**3 for x in range(10) if x%3 == 0]。现在if x % 3 == 0用于决定x计算结果的值,并if x%2 == 0用于决定是否使用x**2x**3作为这些xs的计算结果。