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

Python 如何在没有循环的情况下检查另一个列表包含的列表?,python,list,Python,List,正如标题所提到的,有什么内置的东西可以做这项工作吗?我在dir(list)中找到了它,但没有找到可用的。谢谢。取决于你所说的“包含”是什么意思。也许是这样: if set(a) <= set(b): print "a is in b" if set(a)假设您想查看子列表的所有元素是否也是超级列表的元素: all(超级列表中的x代表子列表中的x)解决方案取决于您希望从列表中获得的值 如果存在重复值的可能性,并且您需要检查测试容器中是否有足够的值,那么下面是一个时间效率低下的解决方

正如标题所提到的,有什么内置的东西可以做这项工作吗?我在
dir(list)
中找到了它,但没有找到可用的。谢谢。

取决于你所说的“包含”是什么意思。也许是这样:

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

if set(a)假设您想查看
子列表
的所有元素是否也是
超级列表
的元素:


all(超级列表中的x代表子列表中的x)

解决方案取决于您希望从列表中获得的值

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

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

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

您可能需要使用

如果设置(a)。发布设置(b):
打印(a包含在b中)

简单且有效。我会检查“set”的用法。谢谢。在功能上似乎与我的解决方案相当——有人知道其中任何一个是否有性能优势吗?我不太相信这一点——对
sub
的调用是线性的,但
@Etaoin:
set
s是哈希表。因此,访问
集中的对象的成本是
O(1)
。在本代码中,您必须检查
set(a)
O(len(set(a))
)中的所有元素,并检查此元素是否在
set(b)
O(1)
)中。但当然,总体成本不是(
O(len(sublist))
)因为集合必须首先从列表中构建。我不确定这需要多少成本,但我认为应该是
O(len(list))
,所以总体成本是
O(len(a))+O(len(b))+O(len(set(a))
很好!谢谢——我错过了对集合的固定时间访问。+1你的评论和这个答案。(当然,在我最后的评论中,
sub
对于
set
)你的答案有什么优势吗?是的,首先没有必要将两个
list
s转换为
set
s。因此,我的建议保存了一条指令(我已经使用
dis.dis()
)。此外,由于方法
issubset
的冗长性,它更具可读性。