タプルのリストに複数のフィルターを適用する効率的で Pythonic な方法を探しています。
例として、次のようなフィルターを想定します。
def f1(t): return t[3]<10
def f2(t): return t[0]!=1
def f3(t): return t[1] in ("lisa","eric")
def f4(t): return t[3]>2
そして、次のような n タプル (つまり、db レコード):
tuples=[
(0,'tom','...',8),
(1,'john','...',17),
(2,'lisa','...',1),
(3,'eric','...',18)
]
以下の作品:
def nFilter(filters,tuples):
if filters and tuples:
return nFilter(filters,filter(filters.pop(),tuples))
else: return tuples
次のような結果が得られます。
>>> nFilter([f1,f2,f3],tuples)
[(2, 'lisa', '...', 1)]
と
>>> nFilter([f1,f2,f3,f4],tuples)
[]
しかし、もっと直接的な方法があるかどうか疑問に思っています。f1(f2(...fn(tuples)...))
私が念頭に置いていたのは、関数の任意のリストに対する関数合成 (つまり ) のようなものです。ドキュメントには関数を含む関数ライブラリへの参照がありcompose
ますが、リンクはすべて無効です。
また、かなり大きなデータ セットでこれを使用することを計画しており、おそらく実稼働 Web サービスで多数のフィルターを使用する予定であるため、効率的である必要があり、このソリューションが有効かどうかはわかりません。
提案や改善は大歓迎です。