Gibt einen Standardwert zurück, wenn ein Wörterbuchschlüssel nicht verfügbar ist
Lesezeit: 6 Minuten
Spyros
Ich brauche eine Möglichkeit, einen Wörterbuchwert zu erhalten, wenn sein Schlüssel existiert, oder einfach zurückzugeben Nonewenn es nicht.
Allerdings wirft Python a KeyError Ausnahme, wenn Sie nach einem Schlüssel suchen, der nicht existiert. Ich weiß, dass ich nach dem Schlüssel suchen kann, aber ich suche nach etwas Deutlicherem. Gibt es eine Möglichkeit, einfach zurückzukehren None wenn der Schlüssel nicht existiert?
Benutz einfach .get(key) Anstatt von [key]
– Gabe
25. Mai 2011 um 20:51 Uhr
Der Zugriff auf den Schlüssel und das Abfangen der Ausnahme ist in Python vollkommen in Ordnung. Es ist sogar ein bekanntes und oft verwendetes Designmuster. Wenn Sie stattdessen None zurückgeben, wird es unmöglich, None als Wert zu speichern, was in manchen Fällen relevant sein kann.
– Ber
25. Mai 2011 um 22:00 Uhr
Manchmal möchten Sie “Keine”-Einträge im Wörterbuch und fehlende Einträge gleich behandeln, in diesem Fall scheint die akzeptierte Antwort den Job gut zu machen.
die zurückkehren wird None wenn key is not in d. Sie können auch einen anderen Standardwert angeben, der anstelle von zurückgegeben wird None:
value = d.get(key, "empty")
Beachten Sie, dass die zweite Variante mit einem Standard-Fallback immer noch zurückkehrt None wenn der Schlüssel explizit zugeordnet ist None im Diktat. Wenn Sie das nicht möchten, können Sie so etwas wie verwenden d.get(key) or "empty".
– cib
5. Juli 2015 um 17:07 Uhr
@cib: Guter Punkt, aber die Lösung hat ein ähnliches Problem – wenn der Schlüssel einem “falschen” Wert zugeordnet ist (wie [], "", False, 0.0 oder tatsächlich None), dann würde Ihre Lösung immer zurückkehren 0. Wenn Sie erwarten Nones als Werte, müssen Sie das tun if key in d: explizit prüfen.
– Tim Pietzcker
5. Juli 2015 um 17:57 Uhr
@cib Prost dafür, ich konnte nicht herausfinden, was ich hier falsch gemacht habe.
– wackelig_col
23. August 2016 um 14:28 Uhr
@TimPietzcker – kannst du bitte deine Antwort erklären? d.get(key) oder “leer”, falls der Schlüssel irgendwelchen “falschen” Werten zugeordnet wird, ist “leer”, wenn ich mich nicht irre.
– MiloMinderbinder
2. September 2019 um 15:06 Uhr
@MiloMinderbinder: "empty" wird zurückgegeben, wenn key ist kein gültiger Schlüssel d. Mit dem Wert hat das nichts zu tun key zugeordnet ist.
– Tim Pietzcker
2. September 2019 um 15:07 Uhr
Wundere dich nicht mehr. Es ist in die Sprache eingebaut.
>>> help(dict)
Help on class dict in module builtins:
class dict(object)
| dict() -> new empty dictionary
| dict(mapping) -> new dictionary initialized from a mapping object's
| (key, value) pairs
...
|
| get(...)
| D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.
|
...
Gibt den Wert für Schlüssel zurück, wenn Schlüssel im Wörterbuch ist, sonst Standard. Wenn default nicht angegeben ist, wird standardmäßig None verwendet, sodass diese Methode niemals einen KeyError auslöst.
Dämmerungsläufer
Sie sollten die verwenden get() Methode aus der dict Klasse
d = {}
r = d.get('missing_key', None)
Dies wird dazu führen r == None. Wenn der Schlüssel nicht im Wörterbuch gefunden wird, gibt die get-Funktion das zweite Argument zurück.
Wenn Sie eine transparentere Lösung wünschen, können Sie Unterklassen erstellen dict um dieses Verhalten zu erhalten:
@marineau: Wie ich in einem Kommentar zu einer anderen Antwort erwähnt habe, ist das Problem mit der defaultdict ist, dass es jedes Mal wächst, wenn ein Element angefordert wird, das noch nicht darin enthalten ist. Dies ist nicht immer erwünscht.
– Björn Pollex
25. Mai 2011 um 21:54 Uhr
@BjörnPollex Das ist bei weitem das Elegante. Irgendeine Ahnung, wie man das erweitern kann, um jede Tiefe zu unterstützen? Ich meine machen foo['bar']['test']['sss'] zurückgeben None statt Ausnahme, Nach einer Tiefe fängt es an zu geben TypeError Anstatt von KeyError
– nehem
10. November 2015 um 1:40 Uhr
@itsneo. Sie könnten die gesamte Struktur aus bauen NoneDicts. Dies würde helfen, falls die KeyError würde im innersten Objekt passieren. Andernfalls besteht das Problem darin, dass Sie nach der Rückkehr a None Objekt können Sie es nicht mehr abonnieren. Ein hässlicher Hack wäre, ein anderes Objekt zurückzugeben, das ähnliches testet None. Beachten Sie jedoch, dass dies zu schrecklichen Fehlern führen kann.
– magu_
18. November 2015 um 16:51 Uhr
@BjörnPollex Ist es in Ordnung, sich zu ändern return dict.get(self, key) zu return super().get(key)? Wenn ich mich dann beispielsweise entscheide, OrderedDict anstelle von dict zu verwenden, muss ich mir keine Gedanken über die Änderung mehrerer Codezeilen machen.
– Holz
23. August 2018 um 5:40 Uhr
@Wood Ja, das wäre eigentlich viel schöner!
– Björn Pollex
23. August 2018 um 6:43 Uhr
Asklepios
Ich benutze meistens a Versäumnis für solche Situationen. Sie stellen eine Factory-Methode bereit, die keine Argumente akzeptiert und einen Wert erstellt, wenn sie einen neuen Schlüssel erkennt. Es ist nützlicher, wenn Sie so etwas wie eine leere Liste für neue Schlüssel zurückgeben möchten (siehe Beispiele).
from collections import defaultdict
d = defaultdict(lambda: None)
print d['new_key'] # prints 'None'
@marineau: Wie ich in einem Kommentar zu einer anderen Antwort erwähnt habe, ist das Problem mit der defaultdict ist, dass es jedes Mal wächst, wenn ein Element angefordert wird, das noch nicht darin enthalten ist. Dies ist nicht immer erwünscht.
– Björn Pollex
25. Mai 2011 um 21:54 Uhr
@BjörnPollex Das ist bei weitem das Elegante. Irgendeine Ahnung, wie man das erweitern kann, um jede Tiefe zu unterstützen? Ich meine machen foo['bar']['test']['sss'] zurückgeben None statt Ausnahme, Nach einer Tiefe fängt es an zu geben TypeError Anstatt von KeyError
– nehem
10. November 2015 um 1:40 Uhr
@itsneo. Sie könnten die gesamte Struktur aus bauen NoneDicts. Dies würde helfen, falls die KeyError würde im innersten Objekt passieren. Andernfalls besteht das Problem darin, dass Sie nach der Rückkehr a None Objekt können Sie es nicht mehr abonnieren. Ein hässlicher Hack wäre, ein anderes Objekt zurückzugeben, das ähnliches testet None. Beachten Sie jedoch, dass dies zu schrecklichen Fehlern führen kann.
– magu_
18. November 2015 um 16:51 Uhr
@BjörnPollex Ist es in Ordnung, sich zu ändern return dict.get(self, key) zu return super().get(key)? Wenn ich mich dann beispielsweise entscheide, OrderedDict anstelle von dict zu verwenden, muss ich mir keine Gedanken über die Änderung mehrerer Codezeilen machen.
– Holz
23. August 2018 um 5:40 Uhr
@Wood Ja, das wäre eigentlich viel schöner!
– Björn Pollex
23. August 2018 um 6:43 Uhr
Martineau
Sie könnten eine verwenden dict Objekt get() Methode, wie andere bereits vorgeschlagen haben. Alternativ können Sie, je nachdem, was Sie genau tun, möglicherweise a verwenden try/except Suite so:
try:
<to do something with d[key]>
except KeyError:
<deal with it not being there>
Was als sehr “pythonischer” Ansatz zur Behandlung des Falls angesehen wird.
Ich würde argumentieren, dass dies gegen das Prinzip “explizit statt implizit” verstoßen und die Absicht unklar machen würde. Ganz zu schweigen von der Zerbrechlichkeit und Ausführlichkeit.
– Haroldo_OK
11. April um 10:22 Uhr
@Haroldo_OK: Ich könnte nicht mehr widersprechen, es ist sehr explizit.
– Martinau
11. April um 12:03 Uhr
11306200cookie-checkGibt einen Standardwert zurück, wenn ein Wörterbuchschlüssel nicht verfügbar istyes
Benutz einfach
.get(key)
Anstatt von[key]
– Gabe
25. Mai 2011 um 20:51 Uhr
Der Zugriff auf den Schlüssel und das Abfangen der Ausnahme ist in Python vollkommen in Ordnung. Es ist sogar ein bekanntes und oft verwendetes Designmuster. Wenn Sie stattdessen None zurückgeben, wird es unmöglich, None als Wert zu speichern, was in manchen Fällen relevant sein kann.
– Ber
25. Mai 2011 um 22:00 Uhr
Manchmal möchten Sie “Keine”-Einträge im Wörterbuch und fehlende Einträge gleich behandeln, in diesem Fall scheint die akzeptierte Antwort den Job gut zu machen.
– cib
5. Juli 2015 um 17:02 Uhr