通过python过滤器函数传递参数

时间:2013-10-23 19:08:34

标签: python

我正在尝试按某个关键字过滤单词/短语列表。我在filter()函数中找到的所有示例都使用了数字,所以我想知道这是否可行。我知道如果它调用的函数返回filter()True会将一个项放入结果列表中。

让我说我有这样的事情:

def filtCheck(item, filt):
    if filt in item:
        return True

def funct():
    filt = 'Hi'
    set1 = ['Hello, world', 'Hi there', 'Hi friend']
    set2 = filter(filtCheck(filt), set1)

    print set2

这是我感到困惑的地方。我究竟如何在set2行上写出第一个参数?显然不是它的写法,因为我的filtCheck函数有两个参数,我只提供一个。我是否还需要修改我的filtCheck功能?但是如果我从中获取item参数,则没有字符串来检查过滤是否在。

4 个答案:

答案 0 :(得分:6)

您可以使用lambda(另请参阅http://docs.python.org/2/reference/expressions.html#lambda):

set2 = filter(lambda item: filtCheck(item, 'Hi'), set1)

或者您可以使用functools.partial

from functools import partial
set2 = filter(partial(filtCheck, filt="Hi"), set1)

或者您可以跳过过滤器功能并使用list comprehension

set2 = [item for item in set1 if filtCheck(item, "Hi")]

# or simply

set2 = [item for item in set1 if "Hi" in item]

答案 1 :(得分:1)

更容易切换到list-comp:

filt = 'Hi'
set1 = ['Hello, world', 'Hi there', 'Hi friend']
set2 = [greeting for greeting in set1 if filt in greeting]

答案 2 :(得分:1)

你可以使用currying:

def filtCheck(filt):
    return lambda item: filt in item

def funct():
    filt = 'Hi'
    set1 = ['Hello, world', 'Hi there', 'Hi friend']
    set2 = filter(filtCheck(filt), set1)
    print set2

答案 3 :(得分:1)

对此代码的最直接修改是使filtCheck返回函数而不是布尔值:

def filtCheck(value):
    def is_in_list(lst):
        return value in lst
    return is_in_list

出于您的目的,function的{​​{1}}参数是任何只接受一个参数的函数,并返回一个布尔值,指示它是否应包含在结果中。

但是,来自过滤器文档(http://docs.python.org/2/library/functions.html#filter),

  

请注意,如果函数不是None,则filter(function,iterable)等效于[if if item in item for item(item)]   如果函数为无,则[项目中的项目可迭代项目]。

将此等效性与python3中不推荐使用filter的事实相结合,我建议您使用列表推导:

filter

这可以进一步简化,以消除完全使用def filtCheck(item, filt): if filt in item: return True set2 = [item for item in set1 if filtCheck(filt, item)] 的需要:

filtCheck