Ich habe zwei Listen in Python, wie diese:
temp1 = ['One', 'Two', 'Three', 'Four']
temp2 = ['One', 'Two']
Ich muss eine dritte Liste mit Elementen aus der ersten Liste erstellen, die in der zweiten nicht vorhanden sind. Aus dem Beispiel muss ich bekommen:
temp3 = ['Three', 'Four']
Gibt es schnelle Wege ohne Zyklen und Überprüfung?
python
performance
list
set
set-difference
Max Frai
quelle
quelle
temp1 = ['One', 'One', 'One']
und habentemp2 = ['One']
, wollen Sie['One', 'One']
zurück, oder[]
?Antworten:
Passen Sie auf das auf
wo Sie vielleicht erwarten / wollen, dass es gleich ist
set([1, 3])
. Wenn Sieset([1, 3])
als Antwort wollen, müssen Sie verwendenset([1, 2]).symmetric_difference(set([2, 3]))
.quelle
TypeError: 'str' object is not callable
wenn ich diese Operation ama = [1,2,2,2,3]
undb = [2]
Die vorhandenen Lösungen bieten entweder das eine oder das andere von:
Aber bisher hat keine Lösung beides. Wenn Sie beides möchten, versuchen Sie Folgendes:
Leistungstest
Ergebnisse:
Die von mir vorgestellte Methode sowie die Beibehaltung der Ordnung ist auch (geringfügig) schneller als die Mengen-Subtraktion, da keine unnötige Menge erstellt werden muss. Der Leistungsunterschied wäre deutlicher, wenn die erste Liste erheblich länger als die zweite ist und wenn das Hashing teuer ist. Hier ist ein zweiter Test, der dies demonstriert:
Ergebnisse:
quelle
quelle
temp2
sich vorher in ein Set verwandeln, wird dies ein bisschen effizienter.item not in temp2
unditem not in set(temp2)
wird immer die gleichen Ergebnisse zurückgeben, unabhängig davon, ob Duplikate vorhanden sind oder nichttemp2
.Der Unterschied zwischen zwei Listen (z. B. Liste1 und Liste2) kann mit der folgenden einfachen Funktion ermittelt werden.
oder
Mit der obigen Funktion kann der Unterschied mit
diff(temp2, temp1)
oder ermittelt werdendiff(temp1, temp2)
. Beide geben das Ergebnis['Four', 'Three']
. Sie müssen sich keine Gedanken über die Reihenfolge der Liste machen oder darüber, welche Liste zuerst angegeben werden soll.Python-Dokumentreferenz
quelle
Für den Fall, dass Sie den Unterschied rekursiv möchten, habe ich ein Paket für Python geschrieben: https://github.com/seperman/deepdiff
Installation
Von PyPi installieren:
Anwendungsbeispiel
Importieren
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:
Listenunterschied ignorieren, Reihenfolge oder Duplikate ignorieren: (mit denselben Wörterbüchern wie oben)
Liste mit Wörterbuch:
Sets:
Benannte Tupel:
Benutzerdefinierte Objekte:
Objektattribut hinzugefügt:
quelle
Kann mit dem Python XOR-Operator ausgeführt werden.
quelle
einfachster Weg,
benutze set (). different (set ())
Antwort ist
set([1])
kann als Liste drucken,
quelle
Wenn Sie sich wirklich mit Leistung beschäftigen, verwenden Sie numpy!
Hier ist das vollständige Notizbuch als Kernstück von Github mit Vergleich zwischen Liste, Numpy und Pandas.
https://gist.github.com/denfromufa/2821ff59b02e9482be15d27f2bbd4451
quelle
Ich werde einwerfen, da keine der vorliegenden Lösungen ein Tupel ergibt:
Alternative:
Wie das andere Nicht-Tupel, das Antworten in diese Richtung liefert, bewahrt es die Ordnung
quelle
Ich wollte etwas , das zwei Listen nehmen würde und könnte tun , was
diff
in dembash
Fall ist. Da diese Frage zuerst auftaucht, wenn Sie nach "Python Diff Two Lists" suchen und nicht sehr spezifisch ist, werde ich veröffentlichen, was ich mir ausgedacht habe.Mit
SequenceMather
from könnendifflib
Sie zwei Listen wiediff
folgt vergleichen. Keine der anderen Antworten sagt Ihnen die Position, an der der Unterschied auftritt, aber diese tut es. Einige Antworten geben den Unterschied nur in eine Richtung. Einige ordnen die Elemente neu. Einige behandeln keine Duplikate. Diese Lösung bietet jedoch einen echten Unterschied zwischen zwei Listen:Dies gibt aus:
Wenn Ihre Bewerbung dieselben Annahmen trifft wie die anderen Antworten, profitieren Sie natürlich am meisten davon. Aber wenn Sie nach einem wahren suchen
diff
Funktionalität , ist dies der einzige Weg.Zum Beispiel könnte keine der anderen Antworten Folgendes verarbeiten:
Aber dieser tut:
quelle
Versuche dies:
quelle
Dies könnte sogar schneller sein als Marks Listenverständnis:
quelle
from itertools import filterfalse
Bit hier einfügen. Beachten Sie auch, dass dies keine Sequenz wie die anderen zurückgibt, sondern einen Iterator.Hier ist eine
Counter
Antwort für den einfachsten Fall.Dies ist kürzer als die obige, die Zwei-Wege-Unterschiede bewirkt, da sie nur genau das tut, was die Frage verlangt: Generieren Sie eine Liste der Inhalte in der ersten Liste, nicht jedoch der zweiten.
Abhängig von Ihren Lesbarkeitspräferenzen ergibt sich alternativ ein anständiger Einzeiler:
Ausgabe:
Beachten Sie, dass Sie den
list(...)
Anruf entfernen können, wenn Sie ihn nur durchlaufen.Da diese Lösung Zähler verwendet, werden Mengen im Vergleich zu den vielen satzbasierten Antworten richtig behandelt. Zum Beispiel zu diesem Eingang:
Die Ausgabe ist:
quelle
Sie können eine naive Methode verwenden, wenn die Elemente der Difflist sortiert und festgelegt sind.
oder mit nativen Set-Methoden:
Naive Lösung: 0,0787101593292
Native Set-Lösung: 0.998837615564
quelle
Ich bin etwas zu spät im Spiel dafür, aber Sie können einen Vergleich der Leistung einiger der oben genannten Codes mit diesem machen, zwei der schnellsten Konkurrenten sind,
Ich entschuldige mich für die elementare Ebene der Codierung.
quelle
Hier sind einige einfache, auftragserhaltende Möglichkeiten, zwei Listen von Zeichenfolgen zu unterscheiden.
Code
Ein ungewöhnlicher Ansatz mit
pathlib
:Dies setzt voraus, dass beide Listen Zeichenfolgen mit äquivalenten Anfängen enthalten. Weitere Informationen finden Sie in den Dokumenten . Beachten Sie, dass es im Vergleich zu festgelegten Operationen nicht besonders schnell ist.
Eine einfache Implementierung mit
itertools.zip_longest
:quelle
temp1
undtemp2
Linie sich gut. Wenn Sie zum Beispiel die Elemente umdrehentemp2
oder am Anfang einen anderen Wert einfügentemp2
, gibt der listcomp nur die gleichen Elemente zurück wie intemp1
Dies ist eine andere Lösung:
quelle
Wenn Sie auf
TypeError: unhashable type: 'list'
etwas stoßen, müssen Sie Listen oder Sets in Tupel umwandeln, zSiehe auch Wie vergleiche ich eine Liste von Listen / Sets in Python?
quelle
Nehmen wir an, wir haben zwei Listen
Aus den beiden obigen Listen ist ersichtlich, dass die Punkte 1, 3, 5 in Liste 2 vorhanden sind und die Punkte 7, 9 nicht. Andererseits sind die Punkte 1, 3, 5 in Liste 1 vorhanden und die Punkte 2, 4 nicht.
Was ist die beste Lösung, um eine neue Liste mit den Elementen 7, 9 und 2, 4 zurückzugeben?
Alle obigen Antworten finden die Lösung. Was ist nun die optimalste?
gegen
Mit timeit können wir die Ergebnisse sehen
kehrt zurück
quelle
einzeilige Version der Arulmr- Lösung
quelle
Wenn Sie mehr wie ein Änderungssatz möchten, können Sie Counter verwenden
quelle
Wir können Schnittpunkt minus Vereinigung von Listen berechnen:
quelle
Dies kann mit einer Zeile gelöst werden. Die Frage wird gegeben, zwei Listen (temp1 und temp2) geben ihre Differenz in einer dritten Liste (temp3) zurück.
quelle
Hier ist eine einfache Möglichkeit, zwei Listen zu unterscheiden (unabhängig vom Inhalt). Sie können das Ergebnis wie folgt erhalten:
Hoffe das wird hilfreich.
quelle
Ich bevorzuge die Konvertierung in Mengen und dann die Funktion "different ()". Der vollständige Code lautet:
Ausgabe:
Es ist am einfachsten zu verstehen, und wenn Sie in Zukunft mit großen Datenmengen arbeiten, werden Duplikate entfernt, wenn keine Duplikate erforderlich sind. Ich hoffe es hilft ;-)
quelle
quelle
zB wenn
list1 = [10, 15, 20, 25, 30, 35, 40]
undlist2 = [25, 40, 35]
dann wird die zurückgegebene Liste seinoutput = [10, 20, 30, 15]
quelle