单行列表理解:if-else变体

duc*_*cin 150 python list-comprehension ternary-operator conditional-operator

它更多的是关于python列表理解语法.我有一个列表理解,可以生成给定范围的奇数列表:

[x for x in range(1, 10) if x % 2]
Run Code Online (Sandbox Code Playgroud)

这是一个过滤器 - 我有一个源列表,我删除偶数(if x % 2).我想在这里使用if-then-else之类的东西.以下代码失败:

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

有一个像if-else的python表达式:

1 if 0 is 0 else 3
Run Code Online (Sandbox Code Playgroud)

如何在列表理解中使用它?

shx*_*hx2 293

x if y else z是您为每个元素返回的表达式的语法.因此你需要:

[ x if x%2 else x*100 for x in range(1, 10) ]
Run Code Online (Sandbox Code Playgroud)

由于您在第一个示例中使用过滤器而在第二个示例中没有使用过滤器,因此产生了混淆.在第二个示例中,您只使用三元运算符表达式每个值映射到另一个值.

使用过滤器,您需要:

[ EXP for x in seq if COND ]
Run Code Online (Sandbox Code Playgroud)

没有过滤器,您需要:

[ EXP for x in seq ]
Run Code Online (Sandbox Code Playgroud)

在你的第二个例子中,表达式是一个"复杂的",恰好涉及到if-else.

  • 我有一个问题......`[x for x in range(1,10)if x%2]`是正确的语法.`[x如果x%2表示x在范围内(1,10)]` - 这不是,但是`[x如果x%2否则x*100表示​​x在范围内(1,10)]`再次,正确句法.怎么会? (2认同)
  • @tkoomzaaskz为了进一步说明,请注意你可以在末尾添加第二个`if`:`[x if x%2 else x*100 for x in range(1,10)if if not x%3]`第一个` if`是三元运算符的一部分,第二个`if`是列表推导语法的一部分.整个`x if x%2 else x*100`与简单的`2*x`在"同一级别",它是在`for`的左侧评估的表达式,当过滤`if时不是x%3`已经发生了. (2认同)

luc*_*asg 21

[x if x % 2 else x * 100 for x in range(1, 10) ]
Run Code Online (Sandbox Code Playgroud)


Jam*_*pam 10

只是另一个解决方案,希望有人可能喜欢它:

使用:[假,真] [表达]

>>> map(lambda x: [x*100, x][x % 2 != 0], range(1,10))
[1, 200, 3, 400, 5, 600, 7, 800, 9]
>>>
Run Code Online (Sandbox Code Playgroud)


Ste*_*ald 10

你也可以用列表理解来做到这一点:

A=[[x*100, x][x % 2 != 0] for x in range(1,11)]
print A
Run Code Online (Sandbox Code Playgroud)