Я ищу эффективный питонический способ применения нескольких фильтров к списку кортежей.
В качестве примера предположим, что такие фильтры:
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-records):
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
в документах, но все ссылки мертвы.
Кроме того, поскольку я планирую использовать это на довольно больших наборах данных и, возможно, с большим количеством фильтров в веб-службе производства, он должен быть эффективным, и я не могу сказать, является ли это решение.
Любые предложения или улучшения приветствуются.