我将三个过滤器应用于一个数据结构,该数据结构一个接一个地保存我的数据。我能把这个做得更整齐吗?就像对一个类的单个调用封装了三个过滤器,或者将其从一个过滤器传递到另一个过滤器(更像是一个协同例程)。后者看起来相当可怕,所以我可以用前一个范式巧妙地完成吗?
例如,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)
谢谢。
您可以使用functools.reduce
:
from functools import reduce
list = reduce(lambda acc, pred: filter(pred, acc), filters, list)
filters = (_filter1, _filter2, _filter3)
list_after = filter(lambda x: all(f(x) for f in filters), your_list)
使用列表理解:
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
作为变量名,因为它会屏蔽内置的。