繁体   English   中英

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

[英]How to check if a list is contained inside another list without a loop?

是否有任何内置函数可以在不执行任何循环的情况下检查一个列表是否包含在另一个列表中?

我在dir(list)中寻找它,但没有发现任何有用的东西。

取决于你所说的“包含”。 也许这个:

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

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

all(x in superlist for x in sublist)

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

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

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()可能很耗时,可以使用巧妙的排序和索引来避免。 但我不知道如何在这里避免循环...

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

您可能想要使用一set

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

如果你想验证 list1 中的所有项目都在 list2 上,你可以执行以下列表理解:

all(elem in list1 for elem in list2)

您还可以将 list1 和 list2 直接替换为将返回该列表的代码

all([snack in ["banana", "apple", "lemon", "chocolate", "chips"] for snack in ["chips","chocolate"])

any + list comprehension 可以翻译成这个,方便理解代码

return_value = False
for snack in snacks:
   if snack in groceries:
     return_value = True
   else:
     return_value = False

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM