Python列表推导式中避免transform函数重复执行的方法
解决transform函数重复执行的列表推导式优化方案
针对这个问题,有两种简洁的方法可以在列表推导式中避免重复调用高成本的transform函数:
方法1:用生成器表达式预计算转换结果
先通过生成器表达式一次性算出每个元素的转换值,再对结果进行过滤,这样每个元素只会调用一次transform:
def transform(n): # expensive irl, so don't execute twice return None if n == 2 else n**2 a = [1, 2, 3] lst = [t for t in (transform(n) for n in a) if t is not None] print(lst) # 输出 [1, 9]
这里的(transform(n) for n in a)是一个生成器,会逐个计算每个元素的转换结果,后续的列表推导式直接使用这些预计算好的t,不会重复调用函数。
方法2:使用海象运算符(Python 3.8+)
Python 3.8引入的海象运算符:=可以在表达式内部完成赋值操作,直接在列表推导式的条件里完成转换和赋值,确保每个元素只调用一次函数:
def transform(n): return None if n == 2 else n**2 a = [1, 2, 3] lst = [t for n in a if (t := transform(n)) is not None] print(lst) # 输出 [1, 9]
这个写法更紧凑,t := transform(n)会先执行转换并把结果赋值给t,紧接着判断t是否不为None,符合条件就把t加入列表。
内容的提问来源于stack exchange,提问作者Nico Schlömer
相关产品推荐
相关产品推荐

