如何在没有循环的情况下检查另一个列表包含的列表?

时间:2010-04-06 05:52:50

标签: python list

正如标题所提到的那样,是否有任何内置工作可以完成这项工作?我在dir(list)寻找了那个但是没有可用的那个。谢谢。

4 个答案:

答案 0 :(得分:34)

取决于“包含”的含义。也许这个:

if set(a) <= set(b):
    print "a is in b"

答案 1 :(得分:11)

假设您想查看sublist的所有元素是否也是superlist的元素:

all(x in superlist for x in sublist)

答案 2 :(得分:3)

解决方案取决于您对列表的期望值。

如果有重复值的可能性,并且您需要检查测试容器中是否有足够的值,那么这是一个时间效率低的解决方案:

def contained(candidate, container):
    temp = container[:]
    try:
        for v in candidate:
            temp.remove(v)
        return True
    except ValueError:
        return False

使用以下方法测试此功能:

>>> a = [1,1,2,3]
>>> b = [1,2,3,4,5]
>>> contained(a,b)
False    
>>> a = [1,2,3]
>>> contained(a,b)
True
>>> a = [1,1,2,4,4]
>>> b = [1,1,2,2,2,3,4,4,5]
>>> contained(a,b)
True

当然这个解决方案可以大大改进:list.remove()可能很耗时,可以使用巧妙的排序和索引来避免。但我不知道如何在这里避免循环...

(无论如何,任何其他解决方案都将使用集合或列表推导来实现,它们在内部使用循环......)

答案 3 :(得分:0)

您可能想使用set

if set(a).issubset(b):
    print('a is contained in b')