我正在尝试按某个关键字过滤单词/短语列表。我在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参数,则没有字符串来检查过滤是否在。
答案 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