为什么列表理解中的if-else之前,而if则在之后?

Eth*_*han 1 python list-comprehension

有关python可迭代理解的一般问题:

为什么这样的陈述

[s for s in x if s>2]
Run Code Online (Sandbox Code Playgroud)

if之后的去for,但像声明

[s if s>2 else None for s in x]
Run Code Online (Sandbox Code Playgroud)

if... else之前的云for

che*_*ner 9

条件表达式和理解过滤器唯一的共同点是关键字 的共享使用if

a if b else c是一个条件表达式。目的是保证值是否b正确。它的使用不特定于列表理解;在中,[s if s > 2 else None for s in x]它只是用作用于为新列表提供值的表达式(给定s来自的值)x

的另一种用法if是列表理解本身语法的一部分。它不是表达式的一部分;它指定一个过滤器,该过滤器用于确定是否应将迭代中的特定值传递给表达式。

如果你觉得列表理解为组合的mapfilter,则表达式采用函数参数的地方map,而if过滤器需要以呼叫的地方filter。也就是说,您可以重写任何常规列表理解

[ <expression> for s in xs if <p>]
Run Code Online (Sandbox Code Playgroud)

作为一个组合map,并filter因此:

list(map(lambda s: <expression>, filter(lambda s: <p>, xs)))
Run Code Online (Sandbox Code Playgroud)

你可以看到PEP-202为约列表内涵的讨论(虽然它是旧的,并且不提供可能被考虑任何其他的语法)和PEP-308的条件表达式这确实讨论认为一些替代语法。