1

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

例如, 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)

谢谢你。

4

3 回答 3

3

你可以这样做functools.reduce

from functools import reduce
list = reduce(lambda acc, pred: filter(pred, acc), filters, list)
于 2013-02-11T18:41:28.620 回答
1
filters = (_filter1, _filter2, _filter3)
list_after = filter(lambda x: all(f(x) for f in filters), your_list)
于 2013-02-11T18:40:38.650 回答
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用作变量名,因为它会掩盖内置的。

于 2013-02-11T18:41:02.560 回答