Фильтрация списка Python с аргументами - PullRequest
20 голосов
/ 13 августа 2011

Есть ли в 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)

Это означает, что есть способ вызвать foo, так что a = 1, c = 4, и b привязывается к значениям вMyList

Ответы [ 3 ]

48 голосов
/ 13 августа 2011

Один из подходов - использовать 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)
22 голосов
/ 13 августа 2011

Для этого вы можете создать замыкание:

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]
0 голосов
/ 19 мая 2017
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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...