要素のリストがあり、特定の関数 (たとえば、他の要素までの距離) に従って、それらの一部のみを選択したいとします。
結果として、距離と要素を含むタプルのリストが必要です。だから、私は次のコードを書いた
result = [ ( myFunction(C), C) for C in originalList if myFunction(C) < limit ]
しかしmyFunction
、非常に時間のかかる機能であり、originalList
かなり大きいです。そのようにmyFunction
すると、選択した要素ごとに が 2 回呼び出されます。
では、これを回避する方法はありますか??
他に 2 つの可能性がありますが、あまり良くありません。
最初のものは、フィルタリングされていないリストを作成することです
unfiltered = [ (myFunction(C),C) for C in originalList ]
そしてそれを並べ替えます
result = [ (dist,C) for dist,C in unfiltered if dist < limit ]
しかし、その場合、私は私のものを複製し、
originalList
いくらかのメモリを浪費します (リストは非常に大きくなる可能性があります - 10,000 要素以上)2 つ目はトリッキーで、あまり Pythonic ではありませんが、効率的です (関数は要素ごとに 1 回評価する必要があるため、できる限りのことです)。
myFunction
最後の
結果をグローバル変数(lastResult
たとえば)に保存し、この値はリスト内包表記で再利用されますresult = [ (lastResult,C) for C in originalList if myFunction(C) < limit ]
効率的でPythonicな方法でそれを達成するためのより良いアイデアはありますか??
回答ありがとうございます。