【问题标题】:python `in` keyword as a function used in a filterpython`in`关键字作为过滤器中使用的函数
【发布时间】:2011-07-20 17:54:09
【问题描述】:

是否可以在过滤器中使用 python 关键字in?我知道二元、一元、赋值操作等价于函数调用。

比如

''!=3

相同
''.__ne__(3)

in 函数有类似的东西吗? 我想做这样的事情。 ..

filter( list1.__in__, list2 )

我想这可以通过编写 in 函数来完成......但我只想知道它是否已经内置。

【问题讨论】:

    标签: python keyword


    【解决方案1】:
    filter( list1.__contains__, list2 )
    

    更简洁地写成:

    [ v for v in list2 if v in list1 ]
    

    并显示等价:

    >>> list1 = [2, 4, 6, 8, 10]
    >>> list2 = [1, 2, 3, 4, 5]
    >>> [ v for v in list2 if v in list1 ]
    [2, 4]
    

    【讨论】:

      【解决方案2】:

      您正在寻找__contains__

      >>> [1, 2, 3].__contains__(2)
      True
      >>> [1, 2, 3].__contains__(4)
      False
      

      对于你想做的事:

      >>> list1 = [2, 4, 6, 8, 10]
      >>> filter(list1.__contains__, [1, 2, 3, 4, 5])
      [2, 4]
      

      【讨论】:

        【解决方案3】:

        一般而言,您应该使用operator 模块中的函数,在本例中为operator.contains

        但是使用集合可以更有效地做到这一点:

        In [1]: list1 = [2, 4, 6, 8, 10]
        
        In [2]: list2 = [1, 2, 3, 4, 5]
        
        In [3]: list(set(list1) & set(list2))
        Out[3]: [2, 4]
        

        注意:& 运算符是交集。

        【讨论】:

        • 使用集合并不能保持元素的顺序。
        • 这仅适用于列表中的项目是可散列的。
        【解决方案4】:

        列表理解,如 Dan D. 的回答,绝对是做到这一点的最佳方式。不过,在更一般的情况下,如果您想在将另一个函数作为参数的函数中使用 innot 之类的东西,则可以使用 lambda 函数:

        >>> list1 = [2, 4, 6, 8, 10]
        >>> list2 = [1, 2, 3, 4, 5]
        >>> in_check = lambda item: item in list1
        >>> filter(in_check, list2)
        [2, 4]
        

        再次,我只是为了您的一般知识而提供此内容;处理这种特定情况的最佳方法肯定是使用列表理解,如 Dan D. 的回答。有关 Python 中 lambda 的更多信息,请访问here

        【讨论】:

        • 你应该使用operator模块中的函数,因为它们更快。
        • @ms4py:我认为在大多数 情况下,x in y 的可读性和易用性比使用 operator 模块的好处更重要。只有在我知道我需要性能提升之后,我才会使用 operator 模块。
        猜你喜欢
        • 2014-08-02
        • 1970-01-01
        • 1970-01-01
        • 2012-02-09
        • 2011-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多