我有一个列表理解,近似于:
[f(x) for x in l if f(x)]
Run Code Online (Sandbox Code Playgroud)
其中l是列表,f(x)是返回列表的昂贵函数.
我想避免对f(x)的每次非空出现进行两次f(x)求值.有没有办法在列表理解中保存其输出?
我可以删除最终条件,生成整个列表然后修剪它,但这似乎是浪费.
我有一个方法,可以获取一个列表并返回一个对象
# input a list, returns an object
def map_to_obj(lst):
a_list = f(lst)
return a_list[0] if a_list else None
Run Code Online (Sandbox Code Playgroud)
我想获得一个包含所有未映射的元素的列表None.
像这样:
v_list = [v1, v2, v3, v4]
[map_to_obj(v) for v in v_list if map_to_obj(v)]
Run Code Online (Sandbox Code Playgroud)
但是map_to_obj在列表推导中调用该方法两次似乎并不好.
有没有办法在列表推导中使用局部变量,以便它可以有更好的性能?
或者编译器是否自动优化它?
这就是我想要的:
(sml like)
[let mapped = map_to_obj(v) in for v in v_list if mapped end]
Run Code Online (Sandbox Code Playgroud) 这是关于生成器/列表理解的一般Python问题.
对于给定的iterable,x我需要一个列表推导,如下所示:
[ flatten(e) for e in x if flatten(e) != '' ]
Run Code Online (Sandbox Code Playgroud)
该功能flatten可能很昂贵,所以最好只调用一次.有没有办法在富有表现力的单行中做到这一点?