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

时间:2018-02-10 16:38:01

标签: python list sublist

我认为这很容易找到,但没有运气。基本上如果我有两个列表,我想测试一个列表是另一个列表:

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

list1 == list 2应为True,因为list2list1的子集。我的解决方案太复杂了。我的问题是 - 用列表做一个简单的函数吗?更重要的是,要测试子集,列出即使是正确的方法,还是有更好的数据结构,我应该研究解决这个问题。试图实现我自己的apriori算法版本。提前谢谢了。

5 个答案:

答案 0 :(得分:3)

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

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

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

In [50]: set(list2).issubset(list1)
Out[50]: True

答案 1 :(得分:2)

你想要一个multiset

>>> from multiset import Multiset  # pip install multiset
>>> Multiset(['car', 'dog']) <= Multiset(['car', 'cart', 'dog'])
True
>>> Multiset(['car', 'dog', 'dog']) <= Multiset(['car', 'cart', 'dog'])
False

collections.Counter是标准库multiset,但它缺少子集运算符<=,所以如果你想坚持使用标准库,你必须自己编写循环而不是使用set操作。 / p>

>>> from collections import Counter
>>> counter1 = Counter(['car', 'dog'])
>>> counter2 = Counter(['car', 'cart', 'dog'])
>>> all(counter1[k] <= counter2[k] for k in counter1)
True

答案 2 :(得分:2)

使用列表不仅表明您对成员的存在以及他们的订单感兴趣。如果订单不重要,你应该选择一套。

另一方面,您必须考虑到您不能在列表中拥有相同成员的副本。也许是你的第三种数据结构。

对于我来说,问题最大的不确定性归结为&#39;是否是子集&#39;问题考虑了顺序,可能还有重复的条目如何处理。

你能详细说明吗?

答案 3 :(得分:1)

如果迭代中传递的所有元素都是True,则可以使用返回True的{​​{3}}函数。因此,在我们的示例中,我们可以使用generator-comprehension来生成布尔值,以确定list2中的每个值是否都在list1中:

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

答案 4 :(得分:0)

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

例如,使用list1 = ['a', 'b']list2 = ['a', 'a']无效。

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

set(list2) <= set(list1)  # True

如果你想检查它是否是正确的子集,换句话说两个列表不能相同,你可以使用它:

set(list2) < set(list1)   # True