我将三个过滤器应用于单个数据结构,该数据结构一个接一个地保存我的数据。我可以更整洁地做到这一点吗?就像对一个封装三个过滤器的类的调用或者将它从一个过滤器传递到另一个过滤器一样(更像是一个协同例程)latter看起来很可怕,所以我可以用前一个范例巧妙地做到这一点吗?
实施例, data_list 保存我的数据
def _filter1(elem):
return elem < 0
def _filter2(element):
...
def _filter3(element):
...
list = filter(_filter1,list)
list = filter(_filter2,list)
list = filter(_filter3,list)
我想这可能是最简单的方法:
filters = [_filter1, _filter2, _filter3]
list = apply_filters(*filters)
谢谢。
答案 0 :(得分:3)
您可以使用functools.reduce
:
from functools import reduce
list = reduce(lambda acc, pred: filter(pred, acc), filters, list)
答案 1 :(得分:1)
filters = (_filter1, _filter2, _filter3)
list_after = filter(lambda x: all(f(x) for f in filters), your_list)
答案 2 :(得分:0)
使用列表理解:
lst = [x for x in lst if _filter1(x) and _filter2(x) and _filter3(x)]
使用组合了所有过滤器的功能:
def apply_filters(lst, *filters):
def _filter(elem):
return all(f(elem) for f in filters)
return filter(_filter, lst)
lst = apply_filters(lst, _filter1, _filter2, _filter3)
作为附注,请勿使用list
作为变量名称,因为它会掩盖内置内容。