2011-08-12 10 views
13

¿Hay alguna manera en que pitón llame al filtro en una lista donde la función de filtrado tiene una cantidad de argumentos vinculados durante la llamada? Por ejemplo hay una manera de hacer algo como esto:Filtrado de la lista de Python con argumentos

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

Es decir, ¿hay una manera de llamar a foo tales que a = 1, c = 4, y b consigue ligados a los valores en miLista?

Respuesta

14

Se puede crear un cierre para este propósito:

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

Un método consiste en utilizar 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) 

Otra es utilizar partial:

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

+ 1 para lambda. Y también, si quieres usar lambda sin argumentos, simplemente usa '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) 
Cuestiones relacionadas