Eleganten Weg zu prüfen, ob eine verschachtelte Schlüssel existiert ein python dict
Ist es mehr lesbare Art und Weise zu überprüfen, ob ein Schlüssel begraben in einem dict vorhanden ist, ohne zu prüfen, jede Ebene unabhängig?
Können sagen, die ich brauche, um diesen Wert in ein Objekt begraben (Beispiel entnommen aus Wikidata):
x = s['mainsnak']['datavalue']['value']['numeric-id']
Achten, dass dies nicht das Ende mit einem Laufzeitfehler, ist es erforderlich, entweder überprüfen Sie jede Ebene so:
if 'mainsnak' in s and 'datavalue' in s['mainsnak'] and 'value' in s['mainsnak']['datavalue'] and 'nurmeric-id' in s['mainsnak']['datavalue']['value']:
x = s['mainsnak']['datavalue']['value']['numeric-id']
Die andere Art, wie ich denken kann, um dieses Problem zu lösen ist, wickeln Sie diese in ein try catch
konstruieren, die ich fühle, ist auch eher peinlich für solch eine einfache Aufgabe.
Ich bin auf der Suche nach etwas wie:
x = exists(s['mainsnak']['datavalue']['value']['numeric-id'])
gibt True
wenn alle Ebenen vorhanden ist.
InformationsquelleAutor loomi | 2017-04-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kurz zu fassen, mit Python, müssen Sie Vertrauen es ist einfacher um Vergebung zu bitten, als die Erlaubnis
Die Antwort
Hier ist, wie ich befassen sich mit nested dict-Schlüssel:
Beispiel:
Ausgabe:
It-Schleife in bestimmten
element
testen der einzelnen Schlüssel in der angegebenen Reihenfolge.Ich prefere dieses allen
variable.get('key', {})
Methoden, die ich gefunden, denn es folgt EAFP.Außer Funktion aufgerufen werden wie:
keys_exists(dict_element_to_test, 'key_level_0', 'key_level_1', 'key_level_n', ..)
. Mindestens zwei Argumente erforderlich sind, die element-Taste, aber Sie können hinzufügen, wie viele Tasten Sie wollen.Wenn Sie verwenden müssen, die Art von Karte, die Sie tun können, so etwas wie:
try except
- Anweisungen verlassen wird ziemlich aufblasen.Sie können eine kleine Funktion dieses
try-except
Logik und rufen Sie diese jedes mal,wickeln Sie es in eine Funktion aus.
Okay Okay, also das ist der Weg ... vielen Dank an alle!
Ha! Das scheint schwierig, da kann ich nicht wirklich übergeben der variable an die Funktion ... vorhanden ist(s['missing-key']) wirft bereits ein Fehler!
InformationsquelleAutor Arount
Könnten Sie
.get
mit defaults:aber dies ist fast sicher weniger klar als die Verwendung von try/except.
get
als Standard-Wert hat, kann es einfach passieren, um den Wert vons['mainsnak']['datavalue']['value']['numeric-id']
.InformationsquelleAutor Daniel Roseman
Try/except zu sein scheint, die meisten pythonic Weg, das zu tun.
Die folgende rekursive Funktion sollte funktionieren (gibt Keine, wenn ein Schlüssel nicht gefunden wurde in dem dict):
InformationsquelleAutor Maurice Meyer
Können Sie
pydash
zu prüfen, wenn vorhanden: http://pydash.readthedocs.io/en/latest/api.html#pydash.objects.hasOder, um den Wert (Sie können sogar Standard -, zurück, wenn nicht vorhanden): http://pydash.readthedocs.io/en/latest/api.html#pydash.objects.has
Hier ist ein Beispiel:
InformationsquelleAutor Alexander
Schrieb ich eine Daten-parsing-Bibliothek bezeichnet
dataknead
für Fälle wie diese, im Grunde, weil ich frustriert war von der JSON-die Wikidata-API liefert als gut.Mit, dass die Bibliothek, die Sie tun könnte etwas wie diese
InformationsquelleAutor Husky
Try/except Art und Weise ist die saubere, kein Wettbewerb. Allerdings, es gilt auch als Ausnahme in meiner IDE, die Stoppt die Ausführung beim Debuggen.
Außerdem, ich weiß nicht, wie mithilfe von Ausnahmen wie in-Methode Kontrollstrukturen, die im wesentlichen ist, was geschieht mit dem try/catch.
Hier ist eine kurze Lösung, die keine Rekursion, und unterstützt einen Standard-Wert:
InformationsquelleAutor Houen