1

データを次々に保持する単一のデータ構造に3つのフィルターを適用しています。これをもっときれいにできますか?3つのフィルターをカプセル化するクラスへの1回の呼び出しのように、または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 に答える