在 2 个列表之间获取不常见的项目

Get uncommon items between 2 lists

我有 2 个列表 'a1''a2':

a1 = [[1, 4], [1, 10], [2, 5], [2, 11], [3, 6], [4, 7], [4, 12], [5, 8], [5, 13], 
      [6, 9], [7, 14], [8, 15], [2, 10], [3, 11], [5, 12], [6, 13], [8, 14], [9, 15]]

a2 = [[1, 10], [2, 11], [4, 12], [5, 13], [7, 14], [8, 15], [2, 10], [3, 11], [5, 12], 
      [6, 13], [8, 14], [9, 15]]

我想创建第三个列表,其中包含前两个列表之间不常见的元素,我应该有这样的东西。

[[1, 4], [2, 5], [3, 6], [4, 7], [5, 8], [6, 9]]

可以应用集合差异来提取第一个列表中不包含第二个列表的元素。

a3 = a1.difference(a2)

问题是它适用于 2 个列表,而不适用于本例中的 2 个列表列表。

这种情况有有效的解决方法吗?最好的问候。

[x for x in a1 if x not in a2]

如果您将 a1a2 定义为元组集,您的代码将有效:

a1 = {(1, 4), (1, 10), (2, 5), (2, 11), (3, 6), (4, 7), (4, 12), (5, 8), (5, 13), (6, 9), (7, 14), (8, 15), (2, 10), (3, 11), (5, 12), (6, 13), (8, 14), (9, 15)}
a2 = {(1, 10), (2, 11), (4, 12), (5, 13), (7, 14), (8, 15), (2, 10), (3, 11), (5, 12), (6, 13), (8, 14), (9, 15)}
a3 = a1.difference(a2)
print(a3)

我认为您可以在应用 差异 函数

之前对列表执行此操作
a1 = set(tuple(pair) for pair in a1)

然后你就可以实现你想要的

a3 = a1.difference(a2)

您可以使用列表理解来检查 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]]

如果我们不关心顺序(集合是无序的),我们可以将 a1a2 转换为元组集合并使用 a - ba.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,如文档中所述:

Return a new set with elements in either the set or other but not both.

我们可以使用a ^ ba.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]]