无论元组顺序如何,都在两个元组列表中找到交集

时间:2019-05-15 12:59:06

标签: python list tuples intersection

我有两个元组列表

listA = [('1','2'),('3','4'),('5','6')]
listB = [('2','1'),('7','8')]

即使第二个列表中元组的顺序不同,我也想找到它们的交集。

因此,对于上面的示例:

intersection = [('1','2')]

交集应该返回上面的元组,尽管它在listB中的顺序不同

如何在python中最有效的方式做到这一点?因为我的每个列表都有大约2000个元组。

3 个答案:

答案 0 :(得分:4)

您可以对列表中的每个元素进行排序,将它们转换为元组,然后将列表转换为集合并检查集合的交集:

set(
    [
        tuple(sorted(elem))
        for elem in listA
    ]
) & set(
    [
        tuple(sorted(elem))
        for elem in listB
    ]
)

返回:

{('1', '2')}

答案 1 :(得分:2)

1。尝试对列表中的元组进行排序。

2。将列表转换为集合。

3。打印集合的交集。

listA = [('1','2'),('3','4'),('5','6')]
listB = [('2','1'),('7','8')]
for i, j in enumerate(listA):
    listA[i] = tuple(sorted(j))
for i, j in enumerate(listB):
    listB[i] = tuple(sorted(j))
listA=set(listA)
listB=set(listB)
print(list(listA.intersection(listB)))
  

输出:

[('1', '2')]

答案 2 :(得分:1)

>>> set(map(frozenset, listA)) & set(map(frozenset, listB))
{frozenset({'1', '2'})}

请注意,这假定了元组的唯一性(即,没有元组('1', '1'))。