python - 如何比较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])]
解决方案
您可以使用all()
内置函数来检查是否l
可以b
在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()
,这与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
推荐阅读
- amazon-web-services - 如何将 Amazon Lex 与 8thwall 集成
- mysql - Mysql 和西里尔字符
- r - 检索指定包列表的 .tar.gz 文件
- sql - Redshift:将每个查询的结果列链接到一个表中
- javascript - 无法通过数组中的多个条件进行过滤
- semantic-ui - 如何将语义图标字体设置为显示交换
- php - Resizing PNG image turns black after upload in PHP
- javascript - 从同一类中的另一个方法调用 Javascript 方法
- java - 在 Java 代码中定义一种规范化方法,在 XML 输出中获得不同的方法,如何解决这个问题?
- angular - Angular 11 - 我无法显示本地存储中的值