【问题标题】:How to compare list of lists in Python?如何比较Python中的列表列表?
【发布时间】:2021-01-19 09:24:39
【问题描述】:

我有 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])]

【问题讨论】:

标签: python python-3.x comparison


【解决方案1】:

您可以使用all()内置函数来检查b的所有子列表l是否都可以在a中找到。

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(),使用not 运算符将其否定为True,则列表具有相等的子列表。

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

【讨论】:

  • 您的解决方案独立工作,但我试图在 while 循环中使用它,它会引发错误,我已经编辑了问题,请看一下,谢谢!
  • @hahahj 发生这种情况是因为 numpy 数组与列表不同。您没有指定您使用的是外部库 numpy。尽管如此,你仍然可以像这样使用我的函数:sublists_equal(a.tolist(), b.tolist())
  • 如果此行不起作用,请编辑问题中的 while 循环段。
【解决方案2】:

最简单的方法是在比较之前对列表进行排序:

def compare_lists(a, b):
    return sorted(a) == sorted(b)

这会处理存在重复值的情况。

如果重复无关紧要,并且子列表仅包含 1 和 0,则可以将它们转换为整数:

def sublists_to_integers(lst):
    return [int(''.join(str(i) for i in item), 2) for item in lst]

def compare_lists(a, b):
    return set(sublists_to_integers(a)) == set(sublists_to_integers(b))

这取决于您的列表大小可能会更快和/或使用更少的内存。

【讨论】:

    猜你喜欢
    • 2017-03-12
    • 2011-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多