Ich habe ein wenig Mühe beim Vergleich zweier ähnlicher Wörterbücher. Ich möchte einen strengeren Vergleich der Werte (und wahrscheinlich der Schlüssel).Strict Vergleich der Wörterbücher in Python
Hier ist das wirklich grundlegende Problem:
>>> {'a': True} == {'a': 1}
True
ähnlich (und etwas verwirrend):
>>> {1: 'a'} == {True: 'a'}
True
Dies macht Sinn, weil True == 1
. Was ich suche, ist etwas, das sich eher wie is
verhält, aber zwei möglicherweise verschachtelte Wörterbücher vergleicht. Natürlich können Sie nicht verwenden is
für die beiden Wörterbücher, denn das wird immer False
zurückgeben, auch wenn alle Elemente identisch sind.
Meine aktuelle Lösung ist, einfach zu verwenden, um eine Zeichenfolgendarstellung beider zu erhalten und das zu vergleichen.
>>> json.dumps({'a': True}, sort_keys=True) == json.dumps({'a': 1}, sort_keys=True)
False
Aber das funktioniert nur, wenn alles JSON-serialisierbar ist.
Ich versuchte auch manuell alle Schlüssel und Werte zu vergleichen:
>>> l = {'a': True}
>>> r = {'a': 1}
>>> r.keys() == l.keys() and all(l[key] is r[key] for key in l.keys())
False
Aber das schlägt fehl, wenn die Wörterbücher eine verschachtelte Struktur haben. Ich dachte, ich könnte eine rekursive Version davon schreiben, um den verschachtelten Fall zu behandeln, aber es schien unnötig hässlich und unpythonisch.
Gibt es einen "Standard" oder eine einfache Möglichkeit, dies zu tun?
Danke!
Dies scheint nicht eine gute Idee - kleine ganze Zahlen und Strings, die gültige Bezeichner sind, vergleichen Sie OK mit 'ist' weil sie interniert sind (zumindest in CPython), aber Sie werden schnell Probleme mit allem Nicht-Trivialen haben. Was ist das zugrunde liegende Problem, das Sie zu lösen versucht haben, das Sie zu "True" vs. "1" als Wörterbuchschlüssel geführt hat? – jonrsharpe
einige Beispielwörterbücher mit den verschachtelten Fällen, die Sie finden möchten, wäre nett – Alter
Ich habe ein 'JSONField' in Django, das einige denormalisierte Daten speichert. (Es ist Produktdaten). Mit '{" assembly_required ": True}' wird klar, dass das Produkt assembliert werden muss, aber '{" assembly_required ": 1}' ist etwas weniger klar. DeepDiff sieht aus wie es funktioniert. Müsste nur einen 'DeepDiff (links, rechts) == {}' machen. –