在 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]
如果您将 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)}
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]]
如果我们不关心顺序(集合是无序的),我们可以将 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,如文档中所述:
Return a new set with elements in either the set or other but not both.
我们可以使用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]]
我有 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]
如果您将 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)}
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]]
如果我们不关心顺序(集合是无序的),我们可以将 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,如文档中所述:
Return a new set with elements in either the set or other but not both.
我们可以使用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]]