假设我有一个元素列表,并且我想根据某个函数(例如到另一个元素的距离)只选择其中的一些。
因此,我想要一个包含距离和元素的元组列表。所以,我写了下面的代码
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 的方式吗?
感谢您的回答。