【发布时间】:2013-04-04 13:32:08
【问题描述】:
我的列表理解近似于:
[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)]
对于这种更复杂的情况,我认为记忆化会产生更清晰的最终结果。
【问题讨论】:
-
好吧,即使在这种情况下,您也确实可以通过生成器理解来解决它,只需
[g(x, fx) for x, fx in ((x,f(x)) for x in l) if fx]。重点是x中是否有任何重复。 -
谢谢,看来一切都可以通过理解来解决!我仍然认为,一旦表达式变得如此复杂,记忆会使代码更具可读性。
-
是的,使用生成器(带括号,而不是方括号)。如果您更喜欢记忆化,那很好,但是生成器比构建然后过滤整个列表要好得多,就像您现在所做的那样。 (例如,如果内部生成器是无限的,则可以使用它,而外部理解在找到某个值时停止)。
标签: python list-comprehension code-readability