无论元组顺序如何,在两个元组列表中查找交集
Finding the intersection in two lists of tuples regardless of tuple order
我有两个元组列表
listA = [('1','2'),('3','4'),('5','6')]
listB = [('2','1'),('7','8')]
即使第二个列表中元组的顺序不同,我也想找到它们的交集。
因此,对于上面的示例:
intersection = [('1','2')]
交集应该return上面的元组,尽管它在列表B中的顺序不同
如何以最有效的方式 python 做到这一点?因为我的每个列表都有大约 2000 个元组。
您可以对列表中的每个元素进行排序,将它们转换为元组,然后将列表转换为集合并检查集合交集:
set(
[
tuple(sorted(elem))
for elem in listA
]
) & set(
[
tuple(sorted(elem))
for elem in listB
]
)
returns:
{('1', '2')}
>>> set(map(frozenset, listA)) & set(map(frozenset, listB))
{frozenset({'1', '2'})}
请注意,这假定元组中的唯一性(即没有元组 ('1', '1')
)。
尝试对列表中的元组进行排序。
将列表转换为集合。
打印集合的交集。
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')]
我有两个元组列表
listA = [('1','2'),('3','4'),('5','6')]
listB = [('2','1'),('7','8')]
即使第二个列表中元组的顺序不同,我也想找到它们的交集。
因此,对于上面的示例:
intersection = [('1','2')]
交集应该return上面的元组,尽管它在列表B中的顺序不同
如何以最有效的方式 python 做到这一点?因为我的每个列表都有大约 2000 个元组。
您可以对列表中的每个元素进行排序,将它们转换为元组,然后将列表转换为集合并检查集合交集:
set(
[
tuple(sorted(elem))
for elem in listA
]
) & set(
[
tuple(sorted(elem))
for elem in listB
]
)
returns:
{('1', '2')}
>>> set(map(frozenset, listA)) & set(map(frozenset, listB))
{frozenset({'1', '2'})}
请注意,这假定元组中的唯一性(即没有元组 ('1', '1')
)。
尝试对列表中的元组进行排序。
将列表转换为集合。
打印集合的交集。
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')]