如何通过列表推导中的函数返回值执行过滤?

时间:2017-12-29 07:31:17

标签: python list-comprehension

以下是基本逻辑:

result = []

for item in item_lst:
    code = foo(item)
    if code != -1:
        result.append(code)

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

result = [foo(item) for item in item_lst]
result = [code for code in result if code != -1]

或者

result = [foo(item) for item in item_lst if foo(item) != -1]

将两次调用函数foo。

有没有更好的解决方案?

3 个答案:

答案 0 :(得分:4)

您可以使用generator expression来避免创建第二个列表:

result = [code for code in (foo(item) for item in item_ls) if code != -1]

下面:

(foo(item) for item in item_ls) 

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

答案 1 :(得分:2)

您可以使用filtermap,它更短,也可能更清晰:

restuls = filter(lambda x: x != -1, map(foo, item_ls))

这适用于python3 对于python 2,请考虑使用itertools.imap来避免创建中间列表:

from itertools import imap
restuls = filter(lambda x: x != -1, imap(foo, item_ls))

答案 2 :(得分:0)

试一试:

[x for x in [foo(item) for item in item_lst] if x != -1]