如何在列表理解中设置局部变量?

2024-06-16 14:13:48 发布

您现在位置: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

我想得到一个包含所有映射元素的列表,这些元素不是None

像这样:

v_list = [v1, v2, v3, v4]

[map_to_obj(v) for v in v_list if map_to_obj(v)]

但是在列表理解中两次调用map_to_obj方法似乎不太好。

有没有一种方法可以在列表理解中使用局部变量,使其具有更好的性能?

或者编译器会自动优化它吗?

我想要的是:

(sml like)
[let mapped = map_to_obj(v) in for v in v_list if mapped end] 

Tags: to对象方法innoneobj元素map
3条回答

使用python内置的^{}可以避免重新计算:

list(filter(lambda t: t is not None, map(map_to_obj, v_list)))

启动Python 3.8,并引入assignment expressions (PEP 572):=运算符),可以在列表理解中使用局部变量,以避免调用同一函数的两次:

在我们的例子中,我们可以将map_to_obj(v)的求值命名为变量o,同时使用表达式的结果来过滤列表;从而使用o作为映射值:

[o for v in [v1, v2, v3, v4] if (o := map_to_obj(v))]

使用嵌套列表理解:

[x for x in [map_to_obj(v) for v in v_list] if x]

或者更好的是,围绕生成器表达式的列表理解:

[x for x in (map_to_obj(v) for v in v_list) if x]

相关问题 更多 >