这可以写成一行没有列表理解吗?
for x in vec:
if x > 3:
...
...
答案 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
其中不包括if
和for
等复合语句。
那就是说,请记住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
区块中要执行的操作,您可以使用某种形式的map
或reduce
,但列表推导和生成器表达式可能是执行此操作的最佳方式。 / 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)