2
votes

Recherche de l'intersection dans deux listes de tuples quel que soit l'ordre des tuples

J'ai deux listes de tuples

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

Je veux trouver leur intersection même si l'ordre du tuple dans la deuxième liste est différent.

Donc, pour l'exemple ci-dessus:

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

l'intersection doit renvoyer le tuple ci-dessus bien qu'il ne soit pas dans le même ordre dans listB

Comment puis-je faire cela en python de la manière la plus efficace? car chacun de ma liste contient environ 2000 tuples.


0 commentaires

3 Réponses :


4
votes

Vous pouvez trier chaque élément des listes, les convertir en tuples, puis convertir les listes en ensembles et vérifier l'intersection des ensembles:

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

renvoie:

{ ('1', '2')}


0 commentaires

1
votes
>>> set(map(frozenset, listA)) & set(map(frozenset, listB))
{frozenset({'1', '2'})}
Note that this assumes uniqueness in the tuples (i.e. there's no tuple ('1', '1')).

2 commentaires

comment l'obtenir renvoie une liste de tuples de format [('1', '2')]


Vous pouvez faire [tuple (élément) pour l'élément dans le résultat] .



2
votes

1.Essayez de trier les tuples dans la liste.

2.Convertissez les listes en ensembles.

3.Imprimez l'intersection des ensembles.

[('1', '2')]

Sortie:

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)))


0 commentaires