如何在列表理解中按函数返回值执行过滤器?

sti*_*roc 3 python list-comprehension

以下是基本逻辑:

result = []

for item in item_lst:
    code = foo(item)
    if code != -1:
        result.append(code)
Run Code Online (Sandbox Code Playgroud)

有了列表理解,我应该写两次:

result = [foo(item) for item in item_lst]
result = [code for code in result if code != -1]
Run Code Online (Sandbox Code Playgroud)

要么

result = [foo(item) for item in item_lst if foo(item) != -1]
Run Code Online (Sandbox Code Playgroud)

它将两次调用函数foo。

有没有更好的解决方案?

Mik*_*ler 5

您可以使用生成器表达式来避免创建第二个列表:

result = [code for code in (foo(item) for item in item_ls) if code != -1]
Run Code Online (Sandbox Code Playgroud)

这里:

(foo(item) for item in item_ls) 
Run Code Online (Sandbox Code Playgroud)

是一个生成器表达式。没有创建中间列表。这可能有助于节省内存。