是否可以在过滤器中使用python关键字in
?我知道二进制,一元,赋值操作等同于函数调用。
,例如
''!=3
与
相同''.__ne__(3)
in
函数有类似之处吗?
我想做这样的事情。 ..
filter( list1.__in__, list2 )
我想这可以通过编写in函数来完成...但我只是想知道它是否已经内置。
答案 0 :(得分:15)
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]
答案 1 :(得分:8)
您正在寻找__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]
答案 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]
注意:&
运算符是交集。
答案 3 :(得分:2)
列表理解,如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。