我正在尝试编写一个非常简单的列表表达式
[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条件中引用初始表达式?
答案 0 :(得分:4)
是的,它被称为filter
和map
:)
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
之类的内容;它不会像你的例子那样改变列表理解的结构。