2011-08-12 29 views
13

フィルタリング関数が呼び出し中にバインドされた引数の数を持つリストで、pythonでフィルタを呼び出す方法はありますか?例えば、このような何かをする方法があります:引数を使ったPythonリストのフィルタリング

これはと言うことです
>> def foo(a,b,c): 
    return a < b and b < c 

>> myList = (1,2,3,4,5,6) 

>> filter(foo(a=1,c=4),myList) 
>> (2,3) 

= 1、C = 4、およびbははmyListの値に束縛されることをfooのように呼び出す方法がありますか?

答えて

14

あなたは、この目的のためにクロージャを作成することができます。

def makefilter(a, c): 
    def myfilter(x): 
     return a < x < c 
    return myfilter 

filter14 = makefilter(1, 4) 

myList = [1, 2, 3, 4, 5, 6] 
filter(filter14, myList) 
>>> [2, 3] 
34

一つのアプローチは、lambdaを使用することです:

>>> def foo(a, b, c): 
...  return a < b and b < c 
... 
>>> myTuple = (1, 2, 3, 4, 5, 6) 
>>> filter(lambda x: foo(1, x, 4), myTuple) 
(2, 3) 

もう一つは、partialを使用することです:

>>> from functools import partial 
>>> filter(partial(foo, 1, c=4), myTuple) 
(2, 3) 
+2

+ラムダの場合は1です。また、引数なしでlambdaを使いたい場合は、単に 'filter(lambda:foo(1,4)、myTuple)'を使ってください。 –

-1
def foo(a,c): 
    return lambda b : a < b and b < c 

myList = (1,2,3,4,5,6) 

g = filter(foo(1,4),myList) 
関連する問題