以下是基本逻辑:
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。
有没有更好的解决方案?
答案 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)
您可以使用filter
和map
,它更短,也可能更清晰:
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]