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

You*_*ung 15 python list

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

nos*_*klo 39

取决于你所说的"包含".也许这个:

if set(a) <= set(b):
    print "a is in b"
Run Code Online (Sandbox Code Playgroud)

  • @Etaoin:`set`是哈希表.因此,访问`set`中的对象的成本是'O(1)`.在这段代码中,你必须遍历`set(a)`(`O(len(set(a))`中的所有元素,并检查这个元素是否在`set(b)`(`O(1)`但是当然总体成本我们不是(`O(len(sublist))`)因为集合必须首先从列表中构建.我不确定这是什么成本,但我认为它应该是`O(len (列表))`所以总成本是'O(len(a))+ O(len(b))+ O(len(set(a))` (6认同)

Eta*_*oin 13

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

all(x in superlist for x in sublist)


小智 8

您可能想要使用 set

if set(a).issubset(b):
    print('a is contained in b')
Run Code Online (Sandbox Code Playgroud)


Adr*_*son 5

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

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

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

使用以下命令测试此功能:

>>> 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
Run Code Online (Sandbox Code Playgroud)

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

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