我们都知道python的
[f(x) for x in y if g(x)]
语法。
然而,列表理解的AST表示有多个'if‘表达式的空间:
comprehension = (expr target, expr iter, expr* ifs)
有没有人能给我举个python代码的例子,用来生成一个带有多个'if‘表达式的AST?
发布于 2013-03-06 21:13:35
只需一个接一个地堆叠:
[i for i in range(100) if i > 10 if i < 50]
生成介于11和49之间(包括11和49)的整数。
发布于 2015-05-27 22:20:30
使用内置的all()
允许您在一个迭代器中放置多个布尔表达式或函数,并坚持您的理解。我认为它是一个很好的未被使用的内置工具,它保持了很高的可读性。
>>> [x for x in range(20) if all([1 < x < 10, not x & 1])]
[2, 4, 6, 8]
或
>>> [x for x in range(20) if all([foo(x), bar(x)])]
如果只需要满足一个条件,内置的any()
在这里也可以很好地工作:
>>> [x for x in range(20) if any([1 < x < 10, not x & 1])]
[0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 16, 18]
发布于 2013-03-06 21:22:43
关于这一点,language reference提供了更好的想法:
list_comprehension ::= expression list_for
list_for ::= "for" target_list "in" old_expression_list [list_iter]
list_iter ::= list_for | list_if
list_if ::= "if" old_expression [list_iter]
如您所见,列表理解在末尾定义了一个可选的list_iter
--一个list_iter
。现在,这个list_iter
可以是列表理解的另一个for-part,也可以是一个if-condition。if-condition本身再次以另一个可选的list_iter
结束。这对于在相同的列表理解中使用可选的if条件链接多个for-part是至关重要的。事实上,您还可以为list_iter
构造一个.. if X if Y if Z
部件,这只是一个副作用。
因此,虽然不需要单独链接多个if条件,但它允许以这种方式定义整个语法。
https://stackoverflow.com/questions/15248272
复制相似问题