我有一个获取列表并返回对象的方法:
# 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]
使用python内置的^{} 可以避免重新计算:
启动
Python 3.8
,并引入assignment expressions (PEP 572)(:=
运算符),可以在列表理解中使用局部变量,以避免调用同一函数的两次:在我们的例子中,我们可以将
map_to_obj(v)
的求值命名为变量o
,同时使用表达式的结果来过滤列表;从而使用o
作为映射值:使用嵌套列表理解:
[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]
相关问题 更多 >
编程相关推荐