2011-08-12 14 views
13

Czy istnieje sposób w Pythonie, aby wywołać filtr na liście, w której funkcja filtrowania ma wiele argumentów związanych podczas połączenia. Na przykład czy istnieje sposób, aby zrobić coś takiego:Filtrowanie listy Pythona z argumentami

>> 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) 

To znaczy, czy jest jakiś sposób, aby wywołać foo takie, że a = 1, c = 4, oraz b pobiera związany z wartościami w myList?

Odpowiedz

14

Można utworzyć zamknięcie do tego celu:

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

Jednym ze sposobów jest użycie 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) 

Innym jest użycie partial:

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

+ 1 dla lambda. A także, jeśli chcesz używać lambda bez argumentów, po prostu użyj '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) 
Powiązane problemy