在Python中查找列表中的子列表

在Python中查找列表中的子列表,python,list,sublist,Python,List,Sublist,我想这很容易找到,但运气不好。基本上,如果我有两个列表,我想测试一个列表是另一个列表的子集: list1 = ['car', 'cart', 'dog'] list2 = ['car', 'dog'] list1==list 2应该是True,因为list2是list1的子集。我的解决方案太复杂了。我的问题是-是否有一个简单的函数来处理列表?更重要的是,要测试子集,列表是正确的方法还是有更好的数据结构可以解决这个问题。尝试实现我自己版本的apriori算法。非常感谢 将list2转换为set

我想这很容易找到,但运气不好。基本上,如果我有两个列表,我想测试一个列表是另一个列表的子集:

list1 = ['car', 'cart', 'dog']
list2 = ['car',  'dog']

list1==list 2
应该是
True
,因为
list2
list1
的子集。我的解决方案太复杂了。我的问题是-是否有一个简单的函数来处理列表?更重要的是,要测试子集,列表是正确的方法还是有更好的数据结构可以解决这个问题。尝试实现我自己版本的apriori算法。非常感谢

list2
转换为
set
并使用
issubset
方法:

In [48]: list1 = ['car', 'cart', 'dog']

In [49]: list2 = ['car', 'dog']

In [50]: set(list2).issubset(list1)
Out[50]: True
如果传入的iterable中的所有元素都是
True
,则可以使用返回
True
的函数。因此,在我们的例子中,我们可以使用
生成器理解
,它生成布尔值,用于判断
list2
中的每个值是否在
list1
中:

>>> all(i in list1 for i in list2)
True

以下解决方案假定输入列表包含唯一的元素

例如,如果使用
list1=['a','b']
list2=['a','a']
,它将不起作用

list1 = ['car', 'cart', 'dog']
list2 = ['car',  'dog']

set(list2) <= set(list1)  # True
list1=['car','cart','dog']
列表2=['car','dog']
设置(列表2)您想要一个


使用列表不仅表明您对成员的存在感兴趣,还表明您对他们的顺序感兴趣。如果顺序不重要,你应该买一套

另一方面,您必须考虑不能在列表中拥有一个集合中的同一成员的副本。也许您需要第三种数据结构

对于我来说,这个问题最大的不确定性在于“is子集”问题是否考虑了顺序,以及可能如何处理重复条目


你能详细说明一下吗

快乐编码。所以是关于修正你的代码,而不是实现你的想法。请反复阅读,如果您有问题,请提供您的代码。如果遇到错误,请将错误消息逐字复制并粘贴到问题中。除非需要传达布局错误,否则避免使用屏幕截图。我们无法将您的图像复制并粘贴到我们的IDE中来修复您的代码。@NickA我想OP知道,他们只是用这个来解释他们的功能应该如何工作,所以类似于
=
的方法,但是检查subsets@Joe嗯,我想这确实有道理。欢迎来到stack overflow。1.显示您的尝试,即使代码不好/效率低下/完全损坏,您的问题也会因为在请求解决方案2之前显示了尝试而得到更好的回答。“子列表”是不明确的,所以您需要澄清一些行为-排序重要吗?应如何处理重复项?你想要一个严格的子列表,还是平等可以?嗨,瓦西奥,你应该展示你的代码,这样我们(社区)'):看看你有什么技能,你的问题在哪里,可以给出什么样的建议,并证明你不是简单地把你的家庭作业推给别人。这是一种先决条件,你的问题是“主题”和“值得”的努力,社会。背后的原因:4年后,你的问题可能会被其他女孩发现,因为“看看你的确切问题在哪里”是不值得的,那么你应该首先添加代码。和平,你的答案很好,所以我给你+1!这太荒谬了,有人用一种我作为新手不知道的结构帮我把代码减少了几十行,然后问题就被解决了。@Vaslo,别因此而气馁。@Vaslo,你说过我的解决方案太复杂了,然后没有显示出你的解决方案,这一点足以让一些人相信downvote@hee这是二次的,最好是在线性时间内完成。@wim好的一点,我没有考虑效率,但应该考虑效率。
set(list2) < set(list1)   # True
>>> from multiset import Multiset  # pip install multiset
>>> Multiset(['car', 'dog']) <= Multiset(['car', 'cart', 'dog'])
True
>>> Multiset(['car', 'dog', 'dog']) <= Multiset(['car', 'cart', 'dog'])
False
>>> from collections import Counter
>>> counter1 = Counter(['car', 'dog'])
>>> counter2 = Counter(['car', 'cart', 'dog'])
>>> all(counter1[k] <= counter2[k] for k in counter1)
True