Ich habe zwei Wörterbücher, aber zur Vereinfachung nehme ich diese beiden:
>>> x = dict(a=1, b=2)
>>> y = dict(a=2, b=2)
Nun möchte ich vergleichen, ob jedes key, value
Paar in x
den gleichen entsprechenden Wert in hat y
. Also habe ich folgendes geschrieben:
>>> for x_values, y_values in zip(x.iteritems(), y.iteritems()):
if x_values == y_values:
print 'Ok', x_values, y_values
else:
print 'Not', x_values, y_values
Und es funktioniert, da a tuple
zurückgegeben und dann auf Gleichheit verglichen wird.
Meine Fragen:
Ist das richtig? Gibt es einen besseren Weg, dies zu tun? Besser nicht in der Geschwindigkeit, ich spreche von Code-Eleganz.
UPDATE: Ich habe vergessen zu erwähnen, dass ich überprüfen muss, wie viele key, value
Paare gleich sind.
python
dictionary
comparison
user225312
quelle
quelle
x == y
sollte laut stackoverflow.com/a/5635309/186202Antworten:
Wenn Sie wissen möchten, wie viele Werte in beiden Wörterbüchern übereinstimmen, sollten Sie das gesagt haben :)
Vielleicht so etwas:
quelle
list
Schlüssel erstellen .x = {[1,2]: 2}
wird versagen. Die Frage hat bereits Gültigkeitdicts
.list
Schlüssel ist nicht gültig Python - Code - dict Schlüssel muss unveränderlich sein. Daher vergleichen Sie keine Wörterbücher. Wenn Sie versuchen, eine Liste als Wörterbuchschlüssel zu verwenden, wird Ihr Code nicht ausgeführt. Sie haben keine Objekte zum Vergleichen. Dies ist so, als würde man tippen und sichx = dict(23\;dfg&^*$^%$^$%^)
dann beschweren, dass der Vergleich mit dem Wörterbuch nicht funktioniert. Natürlich wird es nicht funktionieren. Tims Kommentar ist dagegen veränderlichvalues
, weshalb ich sagte, dass dies verschiedene Themen sind.set
erfordert, dass Werte hashbar sind unddict
dass Schlüssel hashbar sind.set(x.keys())
funktioniert immer, da Schlüssel hashbar sein müssen, aberset(x.values())
bei Werten, die nicht hashbar sind, fehlschlagen.Was Sie tun möchten, ist einfach
x==y
Was Sie tun, ist keine gute Idee, da die Elemente in einem Wörterbuch keine Reihenfolge haben sollen. Möglicherweise vergleichen Sie
[('a',1),('b',1)]
mit[('b',1), ('a',1)]
(gleiche Wörterbücher, unterschiedliche Reihenfolge).Siehe zum Beispiel Folgendes:
Der Unterschied ist nur ein Element, aber Ihr Algorithmus wird feststellen, dass alle Elemente unterschiedlich sind
quelle
quelle
DataFrame
s erlauben von Natur aus keine wahrheitsgemäßen Vergleiche (es sei denn, sie haben eine Länge von 1), von denen sie erbennumpy.ndarray
. -credit to stackoverflow.com/a/33307396/994076dic1 == dic2
Aus Python-Dokumenten :
Gültig für
py2
undpy3
.quelle
OrderedDict != dict
Ich bin neu in Python, aber am Ende habe ich etwas Ähnliches wie @mouad gemacht
Der XOR-Operator (
^
) sollte alle Elemente des Diktats entfernen, wenn sie in beiden Diktaten gleich sind.quelle
{'a':{'b':1}}
gibtTypeError: unhashable type: 'dict'
)Da anscheinend niemand erwähnt hat
deepdiff
, werde ich es der Vollständigkeit halber hier hinzufügen. Ich finde es sehr praktisch, Diff von (verschachtelten) Objekten im Allgemeinen zu erhalten:Installation
Beispielcode
Ausgabe
Hinweis zum hübschen Drucken des Ergebnisses zur Überprüfung: Der obige Code funktioniert, wenn beide Dikte dieselben Attributschlüssel haben (mit möglicherweise unterschiedlichen Attributwerten wie im Beispiel). Wenn jedoch ein
"extra"
Attribut vorhanden ist, ist eines der Diktate,json.dumps()
schlägt mit fehlLösung: Verwenden
diff.to_json()
undjson.loads()
/ oderjson.dumps()
hübsch drucken:Ausgabe:
Alternative: Verwendung
pprint
führt zu einer anderen Formatierung:Ausgabe:
quelle
Benutz einfach:
quelle
dict1 == dict2
cmp
integrierte Element entfernt (und sollte wie zuvor behandelt behandelt werden . Eine Alternative, die sie vorschlagen:(a > b) - (a < b) == cmp(a, b)
für ein funktionales Äquivalent (oder besser__eq__
und__hash__
)TypeError
:unorderable types: dict() < dict()
Die Antwort von @mouad ist nett, wenn Sie davon ausgehen, dass beide Wörterbücher nur einfache Werte enthalten. Wenn Sie jedoch Wörterbücher haben, die Wörterbücher enthalten, erhalten Sie eine Ausnahme, da Wörterbücher nicht hashbar sind.
Auf den ersten Blick könnte so etwas funktionieren:
quelle
not isinstance(dict1, dict)
stattdessen verwendentype(dict1) is not dict
, funktioniert dies für andere Klassen, die aufdict. Also, instead of
(dict1 [Schlüssel] == dict2 [Schlüssel]), you can do
all (atleast_1d (dict1 [Schlüssel] == dict2 [Schlüssel])) `basieren, um mindestens Arrays zu verarbeiten.for loop
sobald deindicts_are_equal
falsch wird. Es besteht keine Notwendigkeit, weiterzumachen.Eine weitere Möglichkeit, bis zur letzten Anmerkung des OP, besteht darin, die Hashes (
SHA
oderMD
) der als JSON abgelegten Dikte zu vergleichen . Die Art und Weise, wie Hashes erstellt werden, garantiert, dass auch die Quellzeichenfolgen gleich sind, wenn sie gleich sind. Dies ist sehr schnell und mathematisch einwandfrei.quelle
json.dumps(d, sort_keys=True)
Sie erhalten kanonisches JSON, sodass Sie sicher sein können, dass beide Diktate gleichwertig sind. Es kommt auch darauf an, was Sie erreichen wollen. Sobald der Wert nicht JSON-serialisierbar ist, schlägt er fehl. Wer also sagt, dass es ineffizient ist, sollte sich das ujson-Projekt ansehen.Die Funktion ist gut IMO, klar und intuitiv. Aber nur um Ihnen (eine andere) Antwort zu geben, hier ist mein Los:
Kann für Sie oder für andere nützlich sein.
BEARBEITEN:
Ich habe eine rekursive Version der obigen erstellt. Habe das in den anderen Antworten nicht gesehen
quelle
So testen Sie, ob zwei Diktate in Schlüsseln und Werten gleich sind:
Wenn Sie die unterschiedlichen Werte zurückgeben möchten, schreiben Sie sie anders:
Sie müssten es zweimal nennen, dh
quelle
Code
Prüfung
quelle
Ein einfacher Vergleich mit == sollte heutzutage ausreichen (Python 3.8). Auch wenn Sie dieselben Diktate in einer anderen Reihenfolge vergleichen (letztes Beispiel). Das Beste ist, Sie benötigen kein Paket von Drittanbietern, um dies zu erreichen.
quelle
Zu spät in meiner Antwort zu sein ist besser als nie!
Not_Equal vergleichen ist effizienter als Equal vergleichen. Daher sind zwei Diktate nicht gleich, wenn im anderen Diktat keine Schlüsselwerte in einem Diktat gefunden werden. Der folgende Code berücksichtigt, dass Sie möglicherweise das Standarddiktat vergleichen und daher get anstelle von getitem [] verwenden.
Verwenden Sie im get-Aufruf standardmäßig eine Art Zufallswert, der dem abzurufenden Schlüssel entspricht - nur für den Fall, dass das Diktat in einem Diktat den Wert None als Wert hat und dieser Schlüssel im anderen nicht vorhanden ist. Außerdem wird die get! = -Zustand vor der Nicht-In-Bedingung auf Effizienz geprüft, da Sie die Schlüssel und Werte von beiden Seiten gleichzeitig prüfen.
quelle
Ich verwende diese Lösung, die in Python 3 perfekt für mich funktioniert
Es vergleicht Diktat, Liste und alle anderen Typen, die den Operator "==" selbst implementieren. Wenn Sie etwas anderes vergleichen müssen, müssen Sie einen neuen Zweig im "if-Baum" hinzufügen.
Hoffentlich hilft das.
quelle
für python3:
quelle
Hier ist eine weitere Option:
Wie Sie sehen, sind die beiden IDs unterschiedlich. Aber die reichen Vergleichsoperatoren scheinen den Trick zu tun:
quelle
In PyUnit gibt es eine Methode, mit der Wörterbücher wunderbar verglichen werden können. Ich habe es mit den folgenden zwei Wörterbüchern getestet und es macht genau das, wonach Sie suchen.
Ich empfehle nicht,
unittest
in Ihren Produktionscode zu importieren . Meiner Meinung nach könnte die Quelle in PyUnit für die Produktion umgerüstet werden. Es verwendet,pprint
welche "hübschen Drucke" die Wörterbücher. Es scheint ziemlich einfach zu sein, diesen Code so anzupassen, dass er "produktionsbereit" ist.quelle
Siehe Objekte der Wörterbuchansicht: https://docs.python.org/2/library/stdtypes.html#dict
Auf diese Weise können Sie dictView2 von dictView1 subtrahieren und es wird eine Reihe von Schlüssel / Wert-Paaren zurückgegeben, die sich in dictView2 unterscheiden:
Sie können diese Wörterbuchansichtsobjekte schneiden, vereinen, unterscheiden (siehe oben) und symmetrisch unterscheiden.
Besser? Schneller? - nicht sicher, aber Teil der Standardbibliothek - was es zu einem großen Plus für die Portabilität macht
quelle
Der folgende Code hilft Ihnen, die Liste der Diktate in Python zu vergleichen
quelle
quelle
In Python 3.6 kann dies wie folgt erfolgen:
Die Variable ret ist wahr, wenn alle Elemente von dict_1 in dict_2 vorhanden sind
quelle
Hier ist meine Antwort: Verwenden Sie eine rekursive Methode:
Hoffentlich hilft das!
quelle
Warum nicht einfach ein Wörterbuch durchlaufen und dabei das andere überprüfen (vorausgesetzt, beide Wörterbücher haben die gleichen Schlüssel)?
Ausgabe:
quelle
quelle
json.dumps
bei den Standardeinstellungen deterministisch).