首页 > 解决方案 > 如何比较Python中的列表列表?

问题描述

我有 2 个列表,如下所示:

a=[[1,0,1,0,1],[0,0,0,1,0],[1,1,0,0,0]]
b=[[1,0,0,0,1],[0,1,0,1,0],[1,1,0,1,0]]

如果 b 中的所有子列表都存在于 a 中,我想返回 true,反之亦然。这意味着 a 应该等于 b 但子列表的索引可以不同。例如:

a=[[1,0,1,0,1],[0,0,0,1,0],[1,1,0,0,0]]
b=[[1,0,1,0,1],[1,1,0,0,0],[0,0,0,1,0]]

以上 a 和 b 相等,比较应该返回 true。此外,子列表将仅包含 1 或 0 的组合。我如何比较它们?我尝试将它们转换为集合: set(a) 但这会引发错误。除此之外,当我在 while 循环中尝试以下代码时,它给出了一个错误

a=[[1,0,1,0,1],[0,0,0,1,0],[1,1,0,0,0]]
b=[[1,0,1,0,1],[1,1,0,0,0],[0,0,0,1,0]]

def sublists_equal(a, b):
    return all(l for l in b if l in a)

print(sublists_equal(a, b))

错误是:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

我尝试打印两个数组以查看问题所在,它们打印如下:

[[0 1 0 1 0]
 [0 1 1 1 1]
 [0 0 0 0 1]
 [0 1 0 0 0]]
[array([0, 1, 0, 1, 0]), array([0, 0, 0, 0, 1]), array([0, 1, 1, 1, 1]), array([0, 1, 0, 0, 0])]

标签: pythonpython-3.xcomparison

解决方案


您可以使用all()内置函数来检查是否l可以ba.

a=[[1,0,1,0,1],[0,0,0,1,0],[1,1,0,0,0]]
b=[[1,0,1,0,1],[1,1,0,0,0],[0,0,0,1,0]]

def sublists_equal(a, b):
    return all(l for l in b if l in a)

print(sublists_equal(a, b))

如果您想使用集合,您必须将每个子列表转换为一个元组,它是一种可散列类型,然后比较它们的对称差异,由^返回两个列表中未找到的元素集合的运算符表示。如果对称差是空的set(),这与True使用not运算符相反,则列表具有相等的子列表。

def sublist_equal2(a, b):
    return not set([tuple(l) for l in a]) ^ set([tuple(l) for l in b])

print(sublist_equal2(a, b))

输出:

True

推荐阅读