Viele SO Beiträge zeigen, wie effizient die Existenz eines Schlüssels in einem Wörterbuch zu überprüfen, zum Beispiel Check if a given key already exists in a dictionaryPython-Check Multi-Level-dict Schlüssel Existenz
Wie kann ich tun dies für eine Multi-Level-Schlüssel? wenn d["a"]["b"]
ein dict Zum Beispiel ist, wie kann ich überprüfen, ob d["a"]["b"]["c"]["d"]
ohne etwas horrend wie dies zu tun gibt:
if "a" in d and isInstance(d["a"], dict) and "b" in d["a"] and isInstance(d["a"]["b"], dict) and ...
Gibt es eine Syntax wie
if "a"/"b"/"c"/"d" in d
Was ich benutze das eigentlich für: wir haben jsons, die in dicts unter Verwendung von simplejson
geparst sind, von denen ich Werte extrahieren muss. Einige dieser Werte sind drei oder vier Ebenen tief verschachtelt. aber manchmal existiert der Wert gar nicht. Also wollte ich so etwas wie:
val = None if not d["a"]["b"]["c"]["d"] else d["a"]["b"]["c"]["d"] #here d["a"]["b"] may not even exist
EDIT: lieber nicht zum Absturz bringen, wenn einige Unterschlüssel vorhanden ist, aber kein Wörterbuch, z.B. d["a"]["b"] = 5
.
Dies ist kein Basis Merkmal der Sprache, da es keine Möglichkeit gibt, neue hinzufügen Syntax. Sie könnten eine neue Klasse definieren, die die Funktion __contains__ überschreibt, die vom Ausdruck "x in y" aufgerufen wird. Möchten Sie die Effizienz der Syntax oder Ausführung? Sie sind vielleicht nicht das Gleiche. – mobiusklein
Nun, mein Ziel war effiziente Syntax, aber dies unter der Annahme, dass die O (1) Wörterbuch-Lookup-Zeit erhalten bleiben würde. Ich stelle jedoch fest, dass das Aufheben von Ausnahmen teuer ist, also ist dies vielleicht mehr als nur das Überprüfen der Schlüsselexistenz. – Tommy
Ausnahmebehandlung wird nicht der kostspielige Teil sein. Was du grundsätzlich willst, ist nicht in der Sprache, wie du darauf hingewiesen hast. Meithams Antwort ist so nah, wie Sie zu dem kommen, was Sie wollen, ohne viel mehr Arbeit zu verrichten, eine Klasse wie bereits erwähnt zu definieren und dann das Problem zu lösen, dass 'simplejson' Objekte in diese und nicht in Vanilla-Wörterbücher entpackt. – mobiusklein