Ich brauche eine Möglichkeit, einen Wörterbuchwert zu erhalten, wenn sein Schlüssel vorhanden ist, oder einfach zurückzukehren None
, wenn dies nicht der Fall ist.
Python löst jedoch eine KeyError
Ausnahme aus, wenn Sie nach einem Schlüssel suchen, der nicht vorhanden ist. Ich weiß, dass ich nach dem Schlüssel suchen kann, aber ich suche etwas expliziteres. Gibt es eine Möglichkeit, einfach zurückzukehren, None
wenn der Schlüssel nicht vorhanden ist?
python
dictionary
key
nonetype
Spyros
quelle
quelle
.get(key)
anstelle von[key]
Antworten:
Sie können verwenden
dict.get()
welches zurückkehren wird
None
wennkey is not in d
. Sie können auch einen anderen Standardwert angeben, der zurückgegeben wird, anstattNone
:quelle
None
wenn der SchlüsselNone
im Diktat explizit zugeordnet ist . Wenn Sie das nicht möchten, können Sie so etwas verwendend.get(key) or "empty"
.[]
,""
,False
,0.0
oder in die TatNone
), dann würde Ihre Lösung immer wieder zurückkehren0
. Wenn SieNone
s als Werte erwarten , müssen Sie dieif key in d:
Prüfung explizit durchführen."empty"
wird zurückgegeben, wennkey
kein gültiger Schlüssel eingegeben wurded
. Es hat nichts mit dem Wert zu tun, dem zugeordnetkey
ist.Ich frage mich nicht mehr. Es ist in die Sprache eingebaut.
quelle
Verwenden
dict.get
Gibt den Wert für key zurück, wenn sich key im Wörterbuch befindet, andernfalls standardmäßig. Wenn kein Standardwert angegeben ist, wird standardmäßig None verwendet, sodass diese Methode niemals einen KeyError auslöst.
quelle
Sie sollten die
get()
Methode aus derdict
Klasse verwendenDies führt zu
r == None
. Wenn der Schlüssel nicht im Wörterbuch gefunden wird, gibt die Funktion get das zweite Argument zurück.quelle
None
explizit übergeben. Dies ist die Standardeinstellung.Wenn Sie eine transparentere Lösung wünschen, können Sie eine Unterklasse erstellen
dict
, um dieses Verhalten zu erhalten:quelle
defaultdict
darin, dass es jedes Mal wächst, wenn ein Element angefordert wird, das noch nicht vorhanden ist. Dies ist nicht immer wünschenswert.foo['bar']['test']['sss']
zurückzukehrenNone
statt Ausnahme, Nach einer Tiefe beginnen , es gibtTypeError
stattKeyError
NoneDicts
. Dies würde helfen, fallsKeyError
dies im innersten Objekt passieren würde. Andernfalls besteht das Problem darin, dass Sie einNone
Objekt nach der Rückgabe nicht mehr abonnieren können. Ein hässlicher Hack wäre, ein anderes Objekt zurückzugeben, das gerne testetNone
. Beachten Sie jedoch, dass dies zu schrecklichen Fehlern führen kann.return dict.get(self, key)
zureturn super().get(key)
? Wenn ich mich dann zum Beispiel für OrderedDict anstelle von dict entscheide, muss ich mir keine Gedanken über das Ändern mehrerer Codezeilen machen.Normalerweise verwende ich für solche Situationen ein Standarddiktat . Sie geben eine Factory-Methode an, die keine Argumente akzeptiert und einen Wert erstellt, wenn ein neuer Schlüssel angezeigt wird. Dies ist nützlicher, wenn Sie eine leere Liste mit neuen Schlüsseln zurückgeben möchten ( siehe Beispiele ).
quelle
defaultdict
ist, dass es jedes Mal weiter wächst, wenn ein nicht vorhandenes Element angefordert wird.Sie können
dict
dieget()
Methode eines Objekts verwenden, wie andere bereits vorgeschlagen haben. Abhängig davon, was Sie gerade tun, können Sie möglicherweise einetry/except
Suite wie die folgende verwenden:Dies wird als ein sehr "pythonischer" Ansatz zur Behandlung des Falls angesehen.
quelle
Eine einzeilige Lösung wäre:
Dies ist nützlich, wenn Sie versuchen, einer neuen Liste Wörterbuchwerte hinzuzufügen und eine Standardeinstellung angeben möchten:
z.B.
quelle
Wie andere oben gesagt haben, können Sie get () verwenden.
Um nach einem Schlüssel zu suchen, können Sie jedoch auch Folgendes tun:
quelle
get
Methode.Ich war überrascht von dem, was in Python2 gegen Python3 möglich war. Ich werde es basierend auf dem beantworten, was ich letztendlich für Python3 getan habe. Mein Ziel war einfach: Überprüfen Sie, ob eine JSON-Antwort im Wörterbuchformat einen Fehler ergab oder nicht. Mein Wörterbuch heißt "Token" und mein gesuchter Schlüssel ist "Fehler". Ich suche nach dem Schlüssel "error" und wenn er nicht vorhanden war und auf den Wert None gesetzt wurde, wird überprüft, ob der Wert None ist. Wenn ja, fahren Sie mit meinem Code fort. Eine else-Anweisung würde behandelt, wenn ich den Schlüssel "error" habe.
quelle
Wenn Sie es schaffen
False
, gibt es auch die in hasattr integrierte Funktion:quelle