for-if在一行中没有列表理解

时间:2010-11-19 15:36:17

标签: python list-comprehension

这可以写成一行没有列表理解吗?

for x in vec: 
    if x > 3:
         ...
         ...

5 个答案:

答案 0 :(得分:3)

不,你不能Python language reference州:

  

复合语句包含一个或   更多'条款。'一个条款包括一个   标题和'套件。'该条款   特定化合物的标题   声明都是一样的   缩进程度。每个子句标题   从唯一的识别开始   关键字,以冒号结束。套房   是一组由...控制的语句   一个条款。套房可以是一个或多个   以分号分隔的简单陈述   在与标题相同的行上,   在标题的冒号之后,或者它   可以是一个或多个缩进语句   在后续行。 只有后者   套件的形式可以包含嵌套   复合语句; 以下是   非法,主要是因为它不会   明确if if条款如下   else子句属于:

if test1: if test2: print x

实际上,Python会为上面的嵌套ifs生成SyntaxError。更正式地关于for,这是它在Python中的语法:

for_stmt ::=  "for" target_list "in" expression_list ":" suite
              ["else" ":" suite]

suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT

stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]

请注意,当for后跟没有缩进的语句时,该语句必须是stmt_list,只允许simple_stmt个实例。 simple_stmt就是这样:

simple_stmt ::=  expression_stmt
                 | assert_stmt
                 | assignment_stmt
                 | augmented_assignment_stmt
                 | pass_stmt
                 | del_stmt
                 | print_stmt
                 | return_stmt
                 | yield_stmt
                 | raise_stmt
                 | break_stmt
                 | continue_stmt
                 | import_stmt
                 | global_stmt
                 | exec_stmt

其中不包括iffor等复合语句。


那就是说,请记住Python的语法是为了清晰。因此,最好不要嵌套这样的语句,这就是生成器/列表推导的目的。如果您认为您的计算对于单行来说足够简单,那么理解就适合您。否则,你真的不希望通过将所有内容放在一行来混乱代码 - 使用缩进很好地分解它。如今,一些额外的线路不会花费太多。

答案 1 :(得分:3)

请参阅@KennyTM ...没有理由压缩那么多。

说了什么,for x in (i in vec if i > 3)使用itertools.ifilter谓词完成了这项工作,以及filter(或只是Python 3中的内置lambda x: x > 3)。它们也适用于所有迭代,并且是懒惰的(例如,如果你在循环期间break,你没有过多地检查单个项目。)

答案 2 :(得分:0)

它可以,但列表推导/生成器表达式是应该在这里使用的确切类型。根据您在if区块中要执行的操作,您可以使用某种形式的mapreduce,但列表推导和生成器表达式可能是执行此操作的最佳方式。 / p>

答案 3 :(得分:0)

对于过滤器中的x(lambda i:i> 3,vec):

答案 4 :(得分:-1)

你可以想象这样的事情:

def do_something(value):
    ...

def do_otherthing(value):
    ...


for x in t: do_something(x) if x>3 else do_otherthing(x)