相关疑难解决方法(0)

在列表推导语法中避免重复的函数调用

我有一个列表理解,近似于:

[f(x) for x in l if f(x)]
Run Code Online (Sandbox Code Playgroud)

其中l是列表,f(x)是返回列表的昂贵函数.

我想避免对f(x)的每次非空出现进行两次f(x)求值.有没有办法在列表理解中保存其输出?

我可以删除最终条件,生成整个列表然后修剪它,但这似乎是浪费.

python list-comprehension code-readability

54
推荐指数
7
解决办法
6707
查看次数

Python:如何在列表推导中设置局部变量?

我有一个方法,可以获取一个列表并返回一个对象

# 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 list-comprehension

26
推荐指数
5
解决办法
2万
查看次数

如果需要两次,只在列表推导中执行一次函数调用

这是关于生成器/列表理解的一般Python问题.

对于给定的iterable,x我需要一个列表推导,如下所示:

[ flatten(e) for e in x if flatten(e) != '' ]
Run Code Online (Sandbox Code Playgroud)

该功能flatten可能很昂贵,所以最好只调用一次.有没有办法在富有表现力的单行中做到这一点?

python list-comprehension generator

4
推荐指数
1
解决办法
866
查看次数