2013-02-11 42 views
1

我將三個過濾器應用於單個數據結構,該數據結構依次存儲我的數據。我可以做得更整齊嗎?就像對一個封裝三個過濾器的類的單個調用或將它從一個過濾器傳遞給另一個過濾器一樣(更像是一個協同例程)。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) 

謝謝。

+1

順便說一句,你不需要在你的第一個過濾器明確地返回真或假:'回報ELEM <0'就足夠了。 – Nicolas 2013-02-11 18:45:42

回答

1
filters = (_filter1, _filter2, _filter3) 
list_after = filter(lambda x: all(f(x) for f in filters), your_list) 
0

使用列表理解:

​​

使用結合了所有的過濾器的功能:

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作爲變量名因爲它會掩蓋內置的。

3

你可以用functools.reduce做到這一點:

from functools import reduce 
list = reduce(lambda acc, pred: filter(pred, acc), filters, list) 
+0

你能解釋一下這到底意味着什麼嗎? acc(umulator)對應於過濾器列表並且pred(icate)到傳遞的列表是否正確?它不應該是相反的。謝謝。 – 2013-02-12 06:24:07

+0

@ShyamSunder'acc'是'list'的累加值; 「pred」是過濾謂詞,例如'_filter1'。 – ecatmur 2013-02-12 08:45:53