【发布时间】:2009-08-03 14:30:18
【问题描述】:
假设我有一个元素列表,我想根据某个函数(例如到另一个元素的距离)只选择其中的一些。
我希望得到一个元组列表,其中包含距离和元素。所以,我写了以下代码
result = [ ( myFunction(C), C) for C in originalList if myFunction(C) < limit ]
但是myFunction是一个非常耗时的函数,而且originalList相当大。这样做,myFunction 将为每个选定的元素调用两次。
那么,有没有办法避免这种情况??
我还有另外两种可能,但都不太好:
-
第一个,是创建 未过滤列表
unfiltered = [ (myFunction(C),C) for C in originalList ]然后排序
result = [ (dist,C) for dist,C in unfiltered if dist < limit ]但在这种情况下,我复制了我的
originalList浪费一些内存 (列表可能很大 - 更多 超过 10,000 个元素) -
第二个是棘手的,不是很pythonic,但很有效(我们能做的最好的,因为函数应该每个元素评估一次)。
myFunction最后存储
产生一个全局变量(例如lastResult),这个值在 列表理解result = [ (lastResult,C) for C in originalList if myFunction(C) < limit ]
你有什么更好的想法来实现这一点,以一种高效和 Pythonic 的方式吗??
感谢您的回答。
【问题讨论】: