我有一个列表理解,它近似于:
[f(x) for x in l if f(x)]
其中 l 是一个列表, f(x) 是一个返回列表的昂贵函数。
我想避免对 f(x) 的每个非空出现两次评估 f(x)。有没有办法在列表理解中保存它的输出?
我可以删除最终条件,生成整个列表,然后修剪它,但这似乎很浪费。
编辑:
提出了两种基本方法:
内部生成器理解:
[y for y in (f(x) for x in l) if y]
或记忆。
我认为对于上述问题,内部生成器理解是优雅的。实际上,我简化了问题以使其清楚,我真的想要:
[g(x, f(x)) for x in l if f(x)]
对于这种更复杂的情况,我认为记忆化会产生更清晰的最终结果。