3

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

[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 条件中的初始表达式?

4

3 回答 3

4

是的,它被称为filtermap:)

filter(condition, map(lambda name: initial-expression, collection))
于 2013-08-23T10:29:17.290 回答
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))
于 2013-08-23T12:05:53.060 回答
0

您基本上可以通过添加一个迭代单元素集合的生成器来在列表推导中创建别名。像这样:

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

它并不比您的示例更冗长,但它基本上等同于如果 python 允许let alias = initial-expression列表理解中的内容;它不会像您的示例那样改变列表理解的结构。

于 2013-08-23T13:32:03.367 回答