2

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)

しかし、私が知る限り、述語関数に余分な引数を渡すことはできません。それでは、どうすれば私が望むことをエレガントな方法で達成できるでしょうか。何か案が?

4

1 に答える 1

5

高階関数[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())
于 2013-03-16T11:36:33.127 に答える