2013-03-16 41 views
1

我有一個名爲eval_params字典,看起來像這樣:如何動態地將謂詞傳遞給過濾函數?

In [1]: eval_params 
Out[1]: 
{1: {'CLF': 'EMNB', 
    'EM': 'False', 
    'FEA': 'words', 
    'NGRAM': '1-1', 
    'PDS': 'T', 
    'PSE': '-', 
    'RN': '1dnf', 
    'STEM': 'False', 
    'UDS': 'He'}, 
2: {'CLF': 'EMNB', 
    'EM': 'False', 
    'FEA': 'words', 
    'NGRAM': '1-1', 
    'PDS': 'TS', 
    'PSE': '-', 
    'RN': '1dnf', 
    'STEM': 'False', 
    'UDS': 'He'}, 
3: {'CLF': 'EMNB', 
    'EM': 'False', 
    'FEA': 'words', 
    'NGRAM': '1-1', 
    'PDS': 'T', 
    'PSE': '-', 
    'RN': '1dnf', 
    'STEM': 'False', 
    'UDS': 'Te'}} 

我不得不篩選本詞典由某些謂詞,我用內置的功能filter

In [2]: filter(pred_func, eval_params.iteritems()) 
Out[2]: 
[(3, 
    {'CLF': 'EMNB', 
    'EM': 'False', 
    'FEA': 'words', 
    'NGRAM': '1-1', 
    'PDS': 'T', 
    'PSE': '-', 
    'RN': '1dnf', 
    'STEM': 'False', 
    'UDS': 'Te'})]  

我的問題是我不想對pred_func內部的謂詞進行硬編碼,但要動態地將它們傳遞給pred_func。目前pred_func看起來是這樣的:

def pred_func((i, d)): 
    # I have to hard-code the parameters to filter by. I don't want that 
    return d['PDS'] == 'T' and d['UDS'] = 'Te' 

相反,我想有這樣的:

def pred_func((i, d), predicates): 
    vals = [] 
    # predicates would be a dictionary such as {'PDS':'T', 'UDS':'Te'} 
    for param, val in predicates.iteritems(): 
     vals.append(d[param] == val) 
    return all(vals) 

不過,據我所知,我可以不通過額外的參數謂詞功能,那麼我怎麼才能以優雅的方式完成我想要的?任何想法?

+1

創建一個高階函數,即返回功能的功能。這就是'operator'中的大部分函數的工作原理:http://docs.python.org/2/library/operator.html。 – 2013-03-16 11:32:07

+0

@FelixKling你能給我一個具體的例子嗎? – pemistahl 2013-03-16 11:32:45

+0

完成........... – 2013-03-16 11:36:44

回答

4

創建一個higher-order function [wikipedia],即返回函數的函數。例如:現在

def pred_func(predicates): 
    # Define a function inside `pred_func`. This function is a "closure" and 
    # will have access to the `predicates` parameter 
    def func((i, d)): 
     # You can simply pass a generator to `all` 
     return all(d[param] == val for param, val in predicates.iteritems()) 

    # Return the function 
    return func 

pred_func是一個函數,它返回接受一個元組作爲參數(就像你原來pred_func功能)的功能。

然後,您可以調用與功能:

filter(pred_func(predicates), eval_params.iteritems()) 
+0

太棒了。到目前爲止,我從來沒有寫過更高級的函數,這就是爲什麼我不知道如何做到這一點。 Dankeschön。 :) – pemistahl 2013-03-16 11:39:30

+0

不客氣! Bitteschoen :) – 2013-03-16 11:41:42

+2

對於3.x用戶:[PEP 3113](http://www.python.org/dev/peps/pep-3113) – eryksun 2013-03-16 11:49:34

相關問題