将函数列表应用于单个变量



我将三个过滤器应用于一个数据结构,该数据结构一个接一个地保存我的数据。我能把这个做得更整齐吗?就像对一个类的单个调用封装了三个过滤器,或者将其从一个过滤器传递到另一个过滤器(更像是一个协同例程)。后者看起来相当可怕,所以我可以用前一个范式巧妙地完成吗?

例如,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作为变量名,因为它会屏蔽内置的。

最新更新