[英]Passing a parameter through a python filter function
我正在尝试按某个关键字过滤单词/短语列表。 我发现的filter()
函数的所有示例都使用了数字,所以我想知道这是否可能。 我知道如果它调用的函数返回True
, filter()
会将一个项目放入结果列表中。
假设我有这样的事情:
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 参数,则没有字符串可以检查 filt 是否存在。
你可以使用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)
或者您可以跳过过滤器功能并使用列表理解 :
set2 = [item for item in set1 if filtCheck(item, "Hi")]
# or simply
set2 = [item for item in set1 if "Hi" in item]
更容易切换到list-comp:
filt = 'Hi'
set1 = ['Hello, world', 'Hi there', 'Hi friend']
set2 = [greeting for greeting in set1 if filt in greeting]
你可以使用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
对此代码的最直接修改是使filtCheck返回函数而不是布尔值:
def filtCheck(value):
def is_in_list(lst):
return value in lst
return is_in_list
为了您的目的, filter
的function
参数是任何函数,它只接受一个参数并返回一个布尔值,指示它是否应该包含在结果中。
但是,从过滤器文档( http://docs.python.org/2/library/functions.html#filter ),
请注意,如果函数不是None,则filter(function,iterable)等效于[iterable中的项目,如果函数(item)],如果函数为None,则[item for item for iterable if item]。
结合这个等价与python3中不推荐使用filter
的事实,我建议你使用列表推导:
def filtCheck(item, filt):
if filt in item:
return True
set2 = [item for item in set1 if filtCheck(filt, item)]
这可以进一步简化,以完全不需要使用filtCheck
:
def funct():
filt = 'Hi'
set1 = ['Hello, world', 'Hi there', 'Hi friend']
set2 = [item for item in set1 if filt in item]
print set2
保持示例的构造并采取安全的方式,我们需要传递一个带有默认值的附加参数:
def funct():
filt = 'Hi'
def filtCheck(item, filt=filt):
if filt in item:
return True
set1 = ['Hello, world', 'Hi there', 'Hi friend']
set2 = list(filter(filtCheck, set1))
print(set2)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.