python-check multi-level-dict-Schlüssel Existenz
SO viele Beiträge zeigen, wie Sie effizient, überprüfen Sie die Existenz eines Schlüssels in einem Wörterbuch, z.B., Prüfen Sie, ob ein bestimmter Schlüssel bereits in einem Wörterbuch vorhanden ist
Wie mache ich dies für eine multi-level-Taste? Zum Beispiel, wenn d["a"]["b"]
ist ein dict, wie kann ich überprüfen, ob d["a"]["b"]["c"]["d"]
vorhanden ist, ohne dabei etwas abscheuliches wie diese:
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 eigentlich mit diesem für Sie: wir haben jsons, analysiert in dicts mit simplejson
, dass ich brauche, um zu extrahieren Werte aus. Einige dieser Werte sind verschachtelte drei und vier Ebenen tief; aber manchmal ist der Wert existiert überhaupt nicht. Also ich wollte 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 zu bringen, wenn einige Unterschlüssel vorhanden ist, aber ist nicht ein Wörterbuch, e.g d["a"]["b"] = 5
.
- Dies ist nicht ein Basis-feature der Sprache, da es keine Möglichkeit zum hinzufügen neuer syntax. Definieren Sie eine neue Klasse überschreibt die enthält - Funktion, die aufgerufen wird, durch die "x in y" Ausdruck. Wollen Sie die Effizienz der syntax oder der Ausführung? Sie können nicht die gleiche Sache.
- Naja, mein Ziel war es, effiziente syntax, aber dies war unter der Annahme, dass der O(1) dictionary-lookup-Zeit bewahrt bleibt. Ich merke jedoch, dass das auslösen von Ausnahmen ist teuer, also vielleicht ist das komplizierter als einfach nur seine Schlüssel Existenz.
- Exception-handling ist nicht das teure Teil. Was wollen Sie grundsätzlich nicht in der Sprache als utdemir hingewiesen. Meitham die Antwort ist so nah wie Sie bekommen, was Sie wollen, ohne zu tun viel mehr Arbeit, die Definition einer Klasse, wie ich bereits erwähnt, und dann gehen durch die Mühe machen
simplejson
entpacken Objekte in die und nicht Vanille-Wörterbücher.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Leider gibt es keine vordefinierte syntax oder eine Allgemeine Bibliothek zur Abfrage Wörterbücher wie das.
Aber ich glaube, der einfachste(und ich denke, es ist effizient genug), was Sie tun können, ist:
Edit: Es ist nicht sehr üblich, aber es ist: https://github.com/akesterson/dpath-python
Edit 2: Beispiele:
help({}.get)
:D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.
. Es wird das Element, wenn es gefunden wurde,None
wenn es nicht so ist.if d["a"]["b"]["c"] is a dict
, also mein code ist vorausgesetzt, Sie sind dicts.isInstance
Unsinn.dict
klären Sie Ihre Frage. Wenn Sie entwederdict
s existieren oder nicht, meine Lösung funktioniert.Dies ist nicht wahrscheinlich eine gute Idee, und ich würde nicht empfehlen, mit diesem in prod. Allerdings, wenn Sie nur das tut, es für Lernzwecke dann die unten könnten für Sie arbeiten.
UPDATE: ich landete beim schreiben meines eigenen, open-source, pippable Bibliothek, die es ermöglicht dies zu tun: https://pypi.python.org/pypi/dictsearch
Eine nicht-rekursive version, ganz ähnlich wie @Meitham-Lösung, die nicht mutieren die gesuchte Schlüssel. Zurück
True
/False
wenn die genaue Struktur ist in der source-Wörterbuch.Die Struktur, die überprüft wird, ist in der form
parent_key:sub_key1:sub_sub_key2
, wo die:
Zeichen ist das Trennzeichen. Natürlich - es wird groß - /Kleinschreibung-Sensitiv, und die stop (zurückFalse
), wenn es eine Liste der im Wörterbuch.Beispiel für die Nutzung: