我有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
。那我怎样才能实现以上比较呢?
答案 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)