2013-10-23 2 views
4

일부 키워드로 단어/구문 목록을 필터링하려고합니다. 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 기능을 수정해야합니까? 나는 그것을 밖으로 항목의 매개 변수를 사용한다면, 여과 및 분리가에 있는지 확인하기 위해 어떤 문자열이 없습니다

답변

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] 
,536을
+0

마지막 옵션을 선택 했으므로 끝났습니다. 고마워요 :) – Xonal

1

쉽게이 목록-빌려로 전환 :

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 

filter에 대한 function 인수는 정확히 O를 받아 처리하는 기능입니다 ne 매개 변수를 검색하고 결과에 포함되어야하는지 여부를 나타내는 부울 값을 반환합니다.

필터 문서 ( http://docs.python.org/2/library/functions.html#filter)로부터 그러나

, 필터 (함수, 반복 가능한)이 동등한 것을

참고 [반복 가능한있는 항목에 대한 항목 경우 함수 (항목)] 기능 없음 하지 없으면 함수가 None 인 경우 [항목이 반복 가능 항목의 항목]. 이것은 더 모두 filtCheck를 사용할 필요 없애 단순화 할 수

def filtCheck(item, filt): 
    if filt in item: 
     return True 

set2 = [item for item in set1 if filtCheck(filt, item)] 

: filter이 python3에서 더 이상 사용되지 않습니다 있다는 사실이 동등성을 결합

, 나는 당신이 지능형리스트를 사용하는 것이 좋습니다 것입니다 :

def funct(): 
    filt = 'Hi' 
    set1 = ['Hello, world', 'Hi there', 'Hi friend'] 
    set2 = [item for item in set1 if filt in item] 

    print set2 
관련 문제