Нахождение пересечения в двух списках кортежей независимо от порядка кортежей - PullRequest
2 голосов
/ 15 мая 2019

У меня есть два списка кортежей

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

Я хочу найти их пересечение, даже если порядок кортежей во втором списке отличается.

Итак, для приведенного выше примера:

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

пересечение должно возвратить кортеж выше, хотя в списке B

* 1010 оно не находится в том же порядке. Как я могу это сделатьв питоне самый эффективный способ?потому что в каждом моем списке около 2000 кортежей.

Ответы [ 3 ]

4 голосов
/ 15 мая 2019

Вы можете отсортировать каждый элемент в списках, преобразовать их в кортежи, затем преобразовать списки в наборы и проверить пересечение наборов:

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

возвращается:

{('1', '2')}

2 голосов
/ 15 мая 2019

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')]
1 голос
/ 15 мая 2019
>>> set(map(frozenset, listA)) & set(map(frozenset, listB))
{frozenset({'1', '2'})}

Обратите внимание, что это предполагает уникальность в кортежах (т. Е. Кортежей нет ('1', '1')).

...