5

我正在尝试按某个关键字过滤单词/短语列表。我发现的所有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 参数,则没有字符串可以检查 filt 是否存在。

4

5 回答 5

7

您可以使用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]
于 2013-10-23T19:10:42.183 回答
1

更容易切换到列表组合:

filt = 'Hi'
set1 = ['Hello, world', 'Hi there', 'Hi friend']
set2 = [greeting for greeting in set1 if filt in greeting]
于 2013-10-23T19:13:25.177 回答
1

你可以使用柯里化:

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
于 2013-10-23T19:23:13.990 回答
1

对这段代码最直接的修改是让 filtCheck 返回一个函数而不是布尔值:

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

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

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

请注意,如果 function 不是 None,filter(function, iterable) 等效于 [item for item in iterable if function(item)],如果 function 是 None,则等效于 [item for item in 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
于 2013-10-23T19:32:14.610 回答
0

保持示例的构造并采取安全的方式,我们需要传递一个带有默认值的附加参数:

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)
于 2022-01-10T04:14:20.080 回答