如何动态地将谓词传递给过滤函数?

2024-05-14 09:04:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个名为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对其使用某些谓词来筛选此词典:

^{pr2}$

我的问题是我不想硬编码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)

然而,据我所知,我不能向谓词函数传递额外的参数,那么如何才能以优雅的方式完成我想要的任务呢?有什么想法吗?在


Tags: falsernfuncwordsemclfpdsuds
1条回答
网友
1楼 · 发布于 2024-05-14 09:04:09

创建一个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函数一样)。在

然后可以使用以下命令调用函数:

^{pr2}$

相关问题 更多 >

    热门问题