2013-10-23 58 views
4

我想通過某個關鍵字過濾單詞/短語列表。我發現filter()函數的所有示例都使用數字,所以我想知道這是否可能。我知道如果filter()函數返回True,它會將項目放入結果列表中。通過python過濾器函數傳遞參數

比方說,我有這樣的事情:

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功能?但是,如果我把項目參數出來的,沒有串檢查FILT是

回答

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] 
+0

與您的最後一個選項一起去。非常感謝 :) – Xonal

1

更容易切換到列表-COMP:

filt = 'Hi' 
set1 = ['Hello, world', 'Hi there', 'Hi friend'] 
set2 = [greeting for greeting in set1 if filt in greeting] 
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 
1

最直接修改這個代碼將有filtCheck返回一個函數,而不是一個布爾值:

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

爲了您的目的,function論據filter是,恰恰o任何功能ne參數並返回一個布爾值,指示是否應將其包含在結果中。

然而,從過濾器文檔(http://docs.python.org/2/library/functions.html#filter

注意,過濾器(功能,可迭代)相當於[項目爲項目在迭代如果函數(項目)]如果函數不是無 和如果函數爲None,[項目在iterable中的項目]。

結合該同等的事實,filter在python3過時,我會建議你使用列表理解:

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