您可以使用列表推导来检查来自a1 的元素是否存在于a2 的集合版本中。由于列表不可散列,我们可以使用元组代替。
# Convert a2 elements to a set of tuples
a2_set = {tuple(sublst) for sublst in a2}
# Use a list comprehension to filter the elements from a1 that don't exist in a2
difference = [sublst for sublst in a1 if tuple(sublst) not in a2_set]
print(difference)
输出:
[[1, 4], [2, 5], [3, 6], [4, 7], [5, 8], [6, 9]]
如果我们不关心顺序(集合是无序的),我们可以将a1 和a2 转换为元组集合,并使用a - b 或a.difference(b) 应用集合差异:
print(a1_set - a2_set)
# {(5, 8), (1, 4), (3, 6), (2, 5), (6, 9), (4, 7)}
print(a1_set.difference(a2_set))
# {(5, 8), (1, 4), (3, 6), (2, 5), (6, 9), (4, 7)}
我们还可以使用列表推导将这些结果转换为嵌套列表:
print([list(tup) for tup in a1_set - a2_set])
# [[5, 8], [1, 4], [3, 6], [2, 5], [6, 9], [4, 7]]
print([list(tup) for tup in a1_set.difference(a2_set)])
# [[5, 8], [1, 4], [3, 6], [2, 5], [6, 9], [4, 7]]
但是,如果您想要 symmetric difference,如文档中所述:
返回一个新集合,其中包含集合中的元素或其他元素,但不能同时包含两者。
我们可以使用a ^ b 或a.symmetric_difference(b) 来计算对称差:
a1_set = {tuple(sublst) for sublst in a1}
a2_set = {tuple(sublst) for sublst in a2}
print(a1_set ^ a2_set)
# {(5, 8), (6, 9), (1, 4), (4, 7), (3, 6), (2, 5)}
print(a1_set.symmetric_difference(a2_set))
# {(5, 8), (6, 9), (1, 4), (4, 7), (3, 6), (2, 5)}
也可以使用列表推导从一组元组转换为嵌套:
print([list(tup) for tup in a1_set ^ a2_set])
# [[5, 8], [6, 9], [1, 4], [4, 7], [3, 6], [2, 5]]
print([list(tup) for tup in a1_set.symmetric_difference(a2_set)])
# [[5, 8], [6, 9], [1, 4], [4, 7], [3, 6], [2, 5]]