我正在寻找一种有效的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
Run Code Online (Sandbox Code Playgroud)
像这样的n元组(即db-records):
tuples=[
(0,'tom','...',8),
(1,'john','...',17),
(2,'lisa','...',1),
(3,'eric','...',18)
]
Run Code Online (Sandbox Code Playgroud)
以下作品:
def nFilter(filters,tuples):
if filters and tuples:
return nFilter(filters,filter(filters.pop(),tuples))
else: return tuples
Run Code Online (Sandbox Code Playgroud)
结果如下:
>>> nFilter([f1,f2,f3],tuples)
[(2, 'lisa', '...', 1)]
Run Code Online (Sandbox Code Playgroud)
和
>>> nFilter([f1,f2,f3,f4],tuples)
[]
Run Code Online (Sandbox Code Playgroud)
但我想知道是否有更直接的方式; 我想到的是功能组合(即f1(f2(...fn(tuples)...))),用于任意功能列表.在文档中引用了包含函数的函数库compose,但链接都已死亡.
此外,由于我计划在相当大的数据集上使用它,并且可能在生产Web服务中使用大量过滤器,因此它必须是高效的,并且我无法确切地说这个解决方案是否正确.
欢迎任何建议或改进.
我正在阅读关于SFINAE的这篇文章,我找到了这对有趣的功能:
template<int I> void div(char(*)[I % 2 == 0] = 0) {
// this overload is selected when I is even
}
template<int I> void div(char(*)[I % 2 == 1] = 0) {
// this overload is selected when I is odd
}
Run Code Online (Sandbox Code Playgroud)
这很好用(g ++ - 4.9),但我并不真正理解参数的类型(char(*)[int]-part.).其他人呢?