首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用多个'if's来理解python列表

使用多个'if's来理解python列表
EN

Stack Overflow用户
提问于 2013-03-06 21:11:58
回答 3查看 76.5K关注 0票数 54

我们都知道python的

代码语言:javascript
复制
[f(x) for x in y if g(x)]

语法。

然而,列表理解的AST表示有多个'if‘表达式的空间:

代码语言:javascript
复制
comprehension = (expr target, expr iter, expr* ifs)

有没有人能给我举个python代码的例子,用来生成一个带有多个'if‘表达式的AST?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-06 21:13:35

只需一个接一个地堆叠:

代码语言:javascript
复制
[i for i in range(100) if i > 10 if i < 50]

生成介于11和49之间(包括11和49)的整数。

票数 85
EN

Stack Overflow用户

发布于 2015-05-27 22:20:30

使用内置的all()允许您在一个迭代器中放置多个布尔表达式或函数,并坚持您的理解。我认为它是一个很好的未被使用的内置工具,它保持了很高的可读性。

代码语言:javascript
复制
>>> [x for x in range(20) if all([1 < x < 10, not x & 1])]
[2, 4, 6, 8]

代码语言:javascript
复制
>>> [x for x in range(20) if all([foo(x), bar(x)])]

如果只需要满足一个条件,内置的any()在这里也可以很好地工作:

代码语言:javascript
复制
>>> [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]
票数 16
EN

Stack Overflow用户

发布于 2013-03-06 21:22:43

关于这一点,language reference提供了更好的想法:

代码语言:javascript
复制
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条件,但它允许以这种方式定义整个语法。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15248272

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档