繁体   English   中英

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

[英]Passing a parameter through a python filter function

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

假设我有这样的事情:

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

为了您的目的, filterfunction参数是任何函数,它只接受一个参数并返回一个布尔值,指示它是否应该包含在结果中。

但是,从过滤器文档( 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM