【问题标题】:Python list filtering with arguments带参数的 Python 列表过滤
【发布时间】:2011-10-26 02:55:53
【问题描述】:

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 中的值?

【问题讨论】:

    标签: python list filter functional-programming


    【解决方案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)
    

    【讨论】:

      【解决方案2】:

      您可以为此创建一个闭包:

      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]
      

      【讨论】:

        【解决方案3】:

        一种方法是使用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)
        

        【讨论】:

        • +1 表示 lambda。此外,如果您想使用不带参数的 lambda,只需使用 filter(lambda: foo(1,4), myTuple)
        • lambda 解决方案应该是选择的答案。如果您必须将过滤器放在一个循环中,那就更清洁了。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-21
        • 2021-07-02
        • 1970-01-01
        • 1970-01-01
        • 2016-03-22
        • 1970-01-01
        相关资源
        最近更新 更多