列表理解:是否有一种简洁的方式来引用if条件中的初始表达式?

时间:2013-08-23 10:22:23

标签: python syntax list-comprehension

我正在尝试编写一个非常简单的列表表达式

[initial-expression for name in collection if condition(initial-expression)]

但是我面临的情况是,初始表达式嵌入了一些“高级”逻辑,我不想在if条件下复制。

详细解决方案

此时,我写道:

[alias for alias in [initial-expression for name in collection]
 if condition(alias)]

由于初始表达(在最外面的列表理解中)是身份,所以它似乎有点过分。

是否有一种常用方法可以使用某个符号名称在if条件中引用初始表达式?

3 个答案:

答案 0 :(得分:4)

是的,它被称为filtermap:)

filter(condition, map(lambda name: initial-expression, collection))

答案 1 :(得分:2)

在实践中,您应该使用“详细”解决方案。为了代码清晰度和效率,我会做一个改进。

变化:

mylist = [alias for 
          alias in [initial_expression for
                    name in collection]
          if condition(alias)]

aliases = (initial_expression for name in collection)
mylist = [alias for alias in aliases if condition(alias)]

aliases = (initial_expression for name in collection)
mylist = list(filter(condition, aliases))

答案 2 :(得分:0)

通过添加迭代单元素集合的生成器,您实际上可以在列表解析中创建别名。像这样:

[alias for name in collection for alias in [initial-expression] if condition(alias)]

它并不比你的例子简洁,但它基本上等同于python在列表理解中允许类似let alias = initial-expression之类的内容;它不会像你的例子那样改变列表理解的结构。