Was ist in Python der beste Weg, um den Unterschied zwischen zwei Listen zu berechnen?
Beispiel
A = [1,2,3,4]
B = [2,5]
A - B = [1,3,4]
B - A = [5]
Verwenden set
Sie diese Option, wenn Sie sich nicht für die Reihenfolge oder Wiederholung von Artikeln interessieren. Verwenden Sie Listenverständnisse, wenn Sie Folgendes tun:
>>> 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)
Erwägen Sie die Verwendung, um sicherzustellen, dass der Algorithmus O (nlogn) anstelle von Theta (n ^ 2) istset
auf B ist harmlos, das Anwenden aufA
und Verwenden des Ergebnisses anstelle des OriginalsA
jedoch nicht.Wenn die Reihenfolge keine Rolle spielt, können Sie einfach die eingestellte Differenz berechnen:
quelle
Sie können eine tun
und
quelle
Einzeiler:
Oder:
quelle
Die obigen Beispiele trivialisierten das Problem der Berechnung von Differenzen. Angenommen, das Sortieren oder Deduplizieren erleichtert die Berechnung des Unterschieds auf jeden Fall. Wenn sich Ihr Vergleich diese Annahmen jedoch nicht leisten kann, benötigen Sie eine nicht triviale Implementierung eines Diff-Algorithmus. Siehe difflib in der Python-Standardbibliothek.
A - B = [[1, 3, 4]]
quelle
print
es von einem Befehl zu einer Funktion geändertreduce
wurdefilter
undmap
als unpythonisch deklariert wurde. (Und ich denke, Guido kann Recht haben - ich verstehe auch nicht, wasreduce
tut.)Python 2.7.3 (Standard, 27. Februar 2014, 19:58:35) - IPython 1.1.0 - timeit: (github gist)
Ergebnisse:
@ roman-bodnarchuk Listenverständnis Funktion def diff (a, b) scheint schneller zu sein.
quelle
quelle
Sie möchten a
set
anstelle von a verwendenlist
.quelle
Für den Fall, dass der Unterschied rekursiv tief in Elemente Ihrer Liste einfließen soll, habe ich ein Paket für Python geschrieben: https://github.com/erasmose/deepdiff
Installation
Von PyPi installieren:
Wenn Sie Python3 sind, müssen Sie auch Folgendes installieren:
Anwendungsbeispiel
Das gleiche Objekt wird leer zurückgegeben
Der Typ eines Elements hat sich geändert
Der Wert eines Artikels hat sich geändert
Artikel hinzugefügt und / oder entfernt
String Unterschied
Saitendifferenz 2
Typänderung
Listenunterschied
Listenunterschied 2: Beachten Sie, dass die Reihenfolge NICHT berücksichtigt wird
Liste mit Wörterbuch:
quelle
einfachster Weg,
benutze set (). different (set ())
Antwort ist
set([1])
quelle
Bei einer Liste von Wörterbüchern funktioniert die vollständige Listenverständnislösung, während die
set
Lösung ausgelöst wirdTestfall
quelle
Einfacher Code, der Ihnen den Unterschied zu mehreren Elementen gibt, wenn Sie dies möchten:
quelle
Wenn Sie sich TimeComplexity of In-Operator ansehen, funktioniert es im schlimmsten Fall mit O (n). Auch für Sets.
Wenn wir also zwei Arrays vergleichen, haben wir im besten Fall eine Zeitkomplexität von O (n) und im schlechtesten Fall von O (n ^ 2).
Eine alternative (aber leider komplexere) Lösung, die im besten und im schlechtesten Fall mit O (n) funktioniert, ist diese:
z.B
quelle