【发布时间】:2011-07-20 17:54:09
【问题描述】:
是否可以在过滤器中使用 python 关键字in?我知道二元、一元、赋值操作等价于函数调用。
比如
''!=3
与
相同''.__ne__(3)
in 函数有类似的东西吗?
我想做这样的事情。 ..
filter( list1.__in__, list2 )
我想这可以通过编写 in 函数来完成......但我只想知道它是否已经内置。
【问题讨论】:
是否可以在过滤器中使用 python 关键字in?我知道二元、一元、赋值操作等价于函数调用。
比如
''!=3
与
相同''.__ne__(3)
in 函数有类似的东西吗?
我想做这样的事情。 ..
filter( list1.__in__, list2 )
我想这可以通过编写 in 函数来完成......但我只想知道它是否已经内置。
【问题讨论】:
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]
【讨论】:
您正在寻找__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]
【讨论】:
一般而言,您应该使用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]
注意:& 运算符是交集。
【讨论】:
列表理解,如 Dan D. 的回答,绝对是做到这一点的最佳方式。不过,在更一般的情况下,如果您想在将另一个函数作为参数的函数中使用 in 或 not 之类的东西,则可以使用 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模块中的函数,因为它们更快。
x in y 的可读性和易用性比使用 operator 模块的好处更重要。只有在我知道我需要性能提升之后,我才会使用 operator 模块。