__contains__函数的多个参数

3 投票
3 回答
2406 浏览
提问于 2025-04-16 16:22

有没有办法在一个列表中用“包含”这个功能来检查多个参数呢?我想看看我在一个列表里的至少一个项目是否存在于另一个列表中。

比如说:
[0,1,4,8,87,6,4,7,5,'a','f','er','fa','vz']

我想检查一下这个列表里是否有我关心的某个项目,比如8、5或者'f'。

我该怎么做呢?

3 个回答

3

使用内置的 set 类型。

>>> l =  [0,1,4,8,87,6,4,7,5,'a','f','er','fa','vz']
>>> s = (8,5,'f')
>>> bool(set(s) & set(l))
True

集合的方法也可以接收可迭代对象作为参数,这样就不用先创建集合了。

最简洁的方法:

在2.6版本中提供了 set.isdisjoint(other) 方法,这个方法可能会优化到一旦找到共同元素就立刻返回。

>>> not set(l).isdisjoint(s)
True

如果你想要循环:

>>> any((val in s) for val in l)
True
7

据我所知,__contains__ 这个方法只接受一个参数,而且这个参数是不能改变的。

不过,你可以通过以下方式来实现你想要的效果:

>>> a = [0,1,4,8,87,6,4,7,5,'a','f','er','fa','vz']
>>> any(map(lambda x: x in a, (8,5,'f')))
True

或者

>>> from functools import partial
>>> from operator import contains
>>> f = partial(contains, a)
>>> any(map(f, (2,3)))
False
2

你可以使用集合:

list1 = [0,1,4,8,87,6,4,7,5,'a','f','er','fa','vz']
tuple1 = (8,5,'f')

def my_contains(first, second):
    return bool(set(first).intersection(second))

my_contains(list1, tuple1) # True
my_contains(list1, [1]) # True
my_contains(list1, (125,178,999)) # False

撰写回答