Comment comparer une liste de listes/jeux en python?
Quelle est la meilleure façon de comparer les 2 listes/ensembles de sortie et les différences? Existe-il des fonctions intégrées qui va m'aider à comparer des listes imbriquées/jeux?
Entrées:
First_list = [['Test.doc', '1a1a1a', 1111],
['Test2.doc', '2b2b2b', 2222],
['Test3.doc', '3c3c3c', 3333]
]
Secnd_list = [['Test.doc', '1a1a1a', 1111],
['Test2.doc', '2b2b2b', 2222],
['Test3.doc', '8p8p8p', 9999],
['Test4.doc', '4d4d4d', 4444]]
Résultat Attendu:
Differences = [['Test3.doc', '3c3c3c', 3333],
['Test3.doc', '8p8p8p', 9999],
['Test4.doc', '4d4d4d', 4444]]
InformationsquelleAutor tang | 2011-05-24
Vous devez vous connecter pour publier un commentaire.
Vous voulez donc la différence entre les deux listes d'éléments.
D'abord que je ferai de chaque liste de listes dans une liste de tuples, de sorte que les n-uplets sont hashable (les listes ne sont pas), de sorte que vous pouvez convertir votre liste de tuples dans un ensemble de n-uplets:
Ensuite, vous pouvez faire des séries:
MODIFIER (suggéré par sdolan): Vous pourriez avoir fait les deux dernières étapes pour chaque liste dans un one-liner:
Remarque:
map
est une fonctionnelle de la programmation de la commande qui s'applique à la fonction dans le premier argument (dans ce cas, letuple
fonction) pour chaque élément dans la deuxième argument (qui dans notre cas est une liste de listes).et de trouver le symétrique de différence entre les deux séries:
Note
first_set ^ secnd_set
est équivalent àsymmetric_difference
.Aussi, si vous ne voulez pas utiliser des ensembles (p. ex., à l'aide de python 2.2), il est assez simple à faire. E. g., avec des interprétations de la liste:
ou avec la fonctionnelle
filter
de commande etlambda
fonctions. (Vous devez tester les deux et de les combiner).map(tuple, first_list)
est plus propre pour le n-uplet de conversion. Aussi,symmetric_difference
n'a pas besoin d'un jeu, c'est le premier argument, de sorte que vous pouvez sauter l'ensemble de conversion ensecnd_set
(même s'il peut le faire sous les couvertures).first_set = set(map(tuple, first_list))
sauter le tuple intermédiaire de la liste. Mais j'essayais d'être pédagogique comme tang semblait python (par exemple, de ne pas mettre de guillemets dans sa chaîne), et personnellement je pense que la compréhension de liste est plus lisible pour les novices que les plus fonctionnellemap
.sort()
je peux le faire, mais que les modifications de la liste d'origine 🙁 ..Ne sais pas si c'est une fonction utile pour cela, mais le "manuel" façon de faire n'est pas difficile:
secondList
, mais pas dansfirstList
; cependant, vous pouvez toujours juste vérifier à la fois la manière d':[x for x in first_list if x not in secnd_list] + [x for x in secnd_list if x not in first_list]
. Aussi c'est une bonne habitude de ne pas utiliser le mot-clé/type/fonctionlist
comme un nom d'une variable. Même après que vous êtes hors de la boucle for, vous ne serez pas en mesure d'utiliser la liste de mots clés.set1 - set2
correspond à la différence (éléments set1, mais pas dans set2), où je pense qu'il voulait la différence symétrique (set1 ^ set2
) pour trouver des éléments dansset1
ouset2
, mais pas les deux. Comme il n'a pas définir de soustraire des éléments de.je suppose que vous aurez à convertir vos listes de jeux:
Une vieille question, mais voici une solution que j'utilise pour le retour des éléments uniques ne trouve pas dans les deux listes.
- Je l'utiliser pour comparer les valeurs de retour d'une base de données et les valeurs générées par un répertoire robot paquet. Je n'aimais pas les autres solutions que j'ai trouvé parce que beaucoup d'entre eux ne pouvaient pas dynamiquement gérer à la fois le plat des listes et des listes imbriquées.
http://docs.python.org/library/difflib.html est un bon point de départ pour ce que vous cherchez.
Si vous l'appliquer de manière récursive pour les deltas, vous devriez être capable de gérer des structures de données imbriquées. Mais il faudra un certain travail.
En utilisant l'ensemble des compréhensions, vous pouvez en faire un one-liner. Si vous le souhaitez:
d'obtenir un ensemble de n-uplets, puis:
Ou pour obtenir une liste de tuples, puis:
Ou pour obtenir une liste de listes (si vous voulez vraiment), alors:
PS: j'ai lu ici: https://stackoverflow.com/a/10973817/4900095 cette carte() la fonction n'est pas un pythonic façon de faire les choses.