-1
votes

Intersection de deux listes en Python en évitant la correspondance redondante

J'ai deux listes Python Match1 et MATCH2

match1 = ['Soumettre', "Paper", "Erreur", "Code", "NotComplete", "Next"]

match2 = ["Soumettre", "papier", "erreur", "code", "bloqué", "papier", "code"]

Maintenant, j'ai utilisé __ contient __ pour trouver les mots communs entre match1 et match2

commun = filtre (ensemble (match1) .__ Contient __, Match2)

impression (liste (commune))

Cela m'a donné la sortie suivante

['Soumettre', 'Paper', "Erreur", "Code", "Papier", "Suivant"]

Le mot papier dans la deuxième liste correspond à nouveau avec le mot papier dans la première liste.

Y a-t-il un moyen d'éviter cela et d'obtenir la sortie suivante?

['Soumettre', 'Paper', "Erreur", "Code", "Suivant"]

EDIT:

L'ordre de la liste est important. C'est pourquoi j'ai utilisé __ contient __ et non intersection.

Mon souci n'est pas la présence d'entrées en double dans la liste des mots communs. J'essaie d'éviter la même entrée dans Match1 être assortie à nouveau avec une autre entrée dans match2 . Si les deux listes avaient deux 'papier' , je le prendrais dans la liste commune comme entrées distinctes.


3 commentaires

Utilisez un ensemble pour les deux variables: Filtre (SET (Match1) .__ Contient __, SET (Match2))


Voulez-vous avoir des éléments répétés dans la liste ou non


@ProGrammerPro Je voudrais garder l'ordre de la liste et la répétation n'a pas d'importance, sauf si cela ne correspond pas à un mot qui a déjà été déjà assorti.


5 Réponses :


0
votes

Et si vous supprimez simplement les duplicats en utilisant:

print(list(dict.fromkeys(list(common)))


0 commentaires

0
votes

Vous pouvez utiliser une compréhension de liste, puis exécuter cela via SET () CODE>

match1 = ['Submit' , 'paper' , 'error' , 'code' , 'notcomplete' , 'next']
match2 = ['Submit' , 'paper' , 'error' , 'code' , 'blocked', 'paper' , 'next']
print(set([x for x in match1 if x in match2]))


1 commentaires

Merci pour votre réponse. Je voudrais garder l'ordre de la liste et c'est pourquoi j'ai utilisé __ contient __. J'ai ajouté une édition.



2
votes

Vous pouvez convertir la liste en définissant, puis utiliser la fonction d'intersection dans Définissez pour rechercher les mots courants.

match1 = ['Submit' , 'paper' , 'error' , 'code' , 'notcomplete' , 'next']
match2 = ['Submit' , 'paper' , 'error' , 'code' , 'blocked', 'paper' , 'next']
match1_set = set(match1)
match2_set = set(match2)
print(match1_set.intersection(match2_set))


1 commentaires

Merci pour votre réponse. Malheureusement, je n'étais pas suffisamment spécifique sur l'exigence de garder la liste de la liste. J'ai ajouté une édition.



0
votes

Bonjour Krishnadas Bienvenue sur Stackoverflow,

Vous pouvez convertir les listes en ensembles qui sont des structures de données qui ne permettent pas de les dupliquer. Je vois que vous l'avez utilisé sur match1 mais vous pouvez également les utiliser sur match2 : xxx


1 commentaires

Merci pour votre réponse. Je voudrais garder l'ordre de la liste et c'est pourquoi j'ai utilisé __ contient __. J'ai ajouté une édition.



0
votes

J'ai pu trouver une réponse pour cela.

Match1 = ['Soumettre', 'Paper', "Erreur", "Code", "NotCommlete '", "Suivant"]

match2 = ["Soumettre", "Papier", "Erreur", "Code", "Bloqué", "Papier", "Suivant"]

commun = liste (filtre (match1 .__ contient __, match2))

commun_final = [w pour w dans match1 si w en commun]

impression (commun_final)

donne

['Soumettre', 'Paper', "Erreur", "Code", "Suivant"]

Merci à tous ceux qui ont aidé.


0 commentaires