En Python, quelle est la meilleure façon de calculer la différence entre deux listes?
exemple
A = [1,2,3,4]
B = [2,5]
A - B = [1,3,4]
B - A = [5]
Utilisez set
si vous ne vous souciez pas de la commande ou de la répétition des articles. Utilisez des listes de compréhension si vous le faites:
>>> def diff(first, second):
second = set(second)
return [item for item in first if item not in second]
>>> diff(A, B)
[1, 3, 4]
>>> diff(B, A)
[5]
>>>
set(b)
pour vous assurer que l'algorithme est O (nlogn) au lieu de Theta (n ^ 2)set
à B est inoffensif, mais l'appliquer àA
et utiliser le résultat au lieu de l'originalA
ne l'est pas.Si la commande n'a pas d'importance, vous pouvez simplement calculer la différence définie:
la source
Vous pouvez faire un
et
la source
Bon mot:
Ou:
la source
Les exemples ci-dessus ont banalisé le problème du calcul des différences. En supposant que le tri ou la déduplication facilite certainement le calcul de la différence, mais si votre comparaison ne peut pas se permettre ces hypothèses, vous aurez besoin d'une implémentation non triviale d'un algorithme diff. Voir difflib dans la bibliothèque standard de python.
A - B = [[1, 3, 4]]
la source
print
est passé d'une commande à une fonction, etreduce
,filter
etmap
ont été déclarés non pythoniques. (Et je pense que Guido a peut-être raison - je ne comprends pasreduce
non plus.)Python 2.7.3 (par défaut, 27 février 2014, 19:58:35) - IPython 1.1.0 - timeit: (github gist)
Résultats:
@ rom-bodnarchuk list comprehensions function def diff (a, b) semble être plus rapide.
la source
la source
Vous voudriez utiliser un
set
au lieu d'unlist
.la source
Dans le cas où vous souhaitez que la différence rentre profondément dans les éléments de votre liste, j'ai écrit un package pour python: https://github.com/erasmose/deepdiff
Installation
Installer depuis PyPi:
Si vous êtes Python3, vous devez également installer:
Exemple d'utilisation
Le même objet revient vide
Le type d'un article a changé
La valeur d'un article a changé
Élément ajouté et / ou supprimé
Différence de chaîne
Différence de chaîne 2
Changement de type
Liste des différences
Énumérez la différence 2: notez qu'elle ne tient pas compte de l'ordre
Liste contenant le dictionnaire:
la source
moyen le plus simple,
utilisez set (). difference (set ())
la réponse est
set([1])
la source
Dans le cas d'une liste de dictionnaires , la solution de compréhension de liste complète fonctionne pendant que la
set
solution soulèveCas de test
la source
Code simple qui vous donne la différence avec plusieurs éléments si vous le souhaitez:
la source
Lorsque l'on regarde TimeComplexity of In-operator, dans le pire des cas, cela fonctionne avec O (n). Même pour les ensembles.
Ainsi, lorsque nous comparons deux tableaux, nous aurons une TimeComplexity de O (n) dans le meilleur des cas et O (n ^ 2) dans le pire des cas.
Une solution alternative (mais malheureusement plus complexe), qui fonctionne avec O (n) dans le meilleur et le pire des cas est celle-ci:
par exemple
la source