如何检查嵌套列表是否是另一个嵌套列表的子集

时间:2019-03-20 21:39:40

标签: python list comparison

我有2个列表,如list<list<list>>列表,我要检查其中一个是否为另一个的子集。

list_1 = [
           [
             [1,2],[2,3]
           ],
           [
             [3,4],[5,6]
           ]
         ]
list_2 = [
           [
             [3,4], [5, 6]
           ]
         ]

因此,预期输出是由于list2具有[[[3,4]]],它是list_1的一部分,因此它应该是子集。

list_1有2个元素,其第二个元素与list_2中的第一个元素匹配,因此list_2是list_1的子集。

比较不是在元素级别,而是在列表级别。

我尝试了set(list_2) < set(list_1),但得到了unhashable type: list。那我怎样才能实现以上比较呢?

3 个答案:

答案 0 :(得分:3)

您可以遍历list_2并检查其元素是否包含在list_1中:

list_1 = [[[1, 2], [2, 3]], [[3, 4], [5, 6]]]
list_2 = [[[3, 4], [5, 6]]]

all(x in list_1 for x in list_2)  # Option 1.
all(map(list_1.__contains__, list_2))  # Option 2.

第二个版本适用于列表(和其他类型),但是a in b更通用,因为如果未定义b.__iter__,它会落在b.__contains__上。

答案 1 :(得分:0)

集合不能保存列表,因为集合依赖于它们的不可变元素并且列表是可变的。如果将列表切换为元组,它将起作用:

list_1 = [(1,2), (2,3), (3,4)]
list_2 = [(2,3), (3,4)]
set(list_2) < set(list_1)

您还可以将外部列表更改为元组,但是我将它们保留为列表,以明确哪些应该是元组。

答案 2 :(得分:0)

您有嵌套列表,因此无法进行简单的比较。这是一个检查l2是否为l1的子集的函数:

(id,page) values (1,page1.php)