Trouver des éléments communs dans les listes
Je suis en train d'écrire un morceau de code qui peut automatiquement le facteur de l'expression. Par exemple,
si j'ai deux listes [1,2,3,4] et [2,3,5], le code doit être en mesure de trouver les éléments communs dans les deux listes, [2,3], et de combiner le reste des éléments dans une nouvelle liste, [1,4,5].
De ce post: Comment trouver la liste intersection?
Je vois que les éléments communs peuvent être trouvés par
set([1,2,3,4]&set([2,3,5]).
Est-il un moyen facile de récupérer des non-commune éléments de chaque liste, dans mon exemple, [1,4] et [5]?
Je peux aller de l'avant et faire une boucle for:
lists = [[1,2,3,4],[2,3,5]]
conCommon = []
common = [2,3]
for elem in lists:
for elem in eachList:
if elem not in common:
nonCommon += elem
Mais ce qui semble redondant et inefficace. Python fournit aucune fonction pratique qui peut le faire? Merci à l'avance!!!!
- vous souhaitez obtenir des listes distinctes comme [1,4] et [5], ou un seul [1,4,5]?
Vous devez vous connecter pour publier un commentaire.
Utiliser le symétrique opérateur de différence pour
set
s (aka l'opérateur XOR):&
(à savoir, linéaire en le nombre d'éléments dans les jeux).Vous pouvez utiliser Intersection concept pour faire face à ce genre de problèmes.
Meilleure chose à propos de l'utilisation de ce code est qu'il fonctionne assez rapide pour les données de grande taille également. J'ai b1 avec 607139 et b2 avec 296029 éléments lorsque j'utilise cette logique-je obtenir mes résultats en 2,9 secondes.
Vieille question, mais il semble que python a une fonction intégrée pour fournir exactement ce que vous cherchez:
.difference()
.EXEMPLE
Cela pourrait aussi être écrit comme:
Calendrier
J'ai couru certains timing des tests sur les deux, et il semble que
.difference()
a un léger avantage, à hauteur de 10% à 15%, mais chaque méthode a fallu environ un huitième de seconde pour filtre 1M éléments (entiers aléatoires entre 500 et 100 000), de sorte que si vous êtes très temps sensible, c'est probablement négligeable.Autres Notes
Il semble que l'OP est à la recherche d'une solution qui fournit deux listes distinctes (ou ensembles) - celui où la première contient des éléments non dans la seconde, et vice versa. La plupart des réponses précédentes retourner une seule liste ou un ensemble qui comprennent tous les éléments.
Il y a également la question de savoir si les éléments qui peuvent être reproduits dans la première liste devrait être compté plusieurs fois, ou juste une fois.
Si l'OP veut maintenir les doublons, une compréhension de liste peut être utilisée, par exemple:
...qui est à peu près la même solution, tel qu'il est posé dans la question d'origine, seulement un peu plus propre. Cette méthode permettrait de maintenir les doublons de la liste d'origine mais est considérablement (comme plusieurs ordres de grandeur) plus lent pour les grands ensembles de données.
Vous pouvez utiliser le
.__xor__
attribut de méthode.ou