2011-08-12 42 views
13

Có cách nào trong python gọi bộ lọc trên danh sách trong đó chức năng lọc có một số đối số bị ràng buộc trong khi gọi. Ví dụ là có một cách để làm một cái gì đó như thế này:Lọc danh sách bằng Python với các đối số

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

này là để nói là có một cách để gọi foo như vậy a = 1, c = 4, và b bị ràng buộc để các giá trị trong myList?

Trả lời

14

Bạn có thể tạo ra một kết thúc cho mục đích này:

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

Một cách tiếp cận là sử dụng 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) 

khác là sử dụng partial:

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

+ 1 cho lambda. Và cũng có thể, nếu bạn muốn sử dụng lambda mà không có đối số, chỉ cần sử dụng 'bộ lọc (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) 
Các vấn đề liên quan