Gibt einen Standardwert zurück, wenn ein Wörterbuchschlüssel nicht verfügbar ist

Lesezeit: 6 Minuten

Benutzer-Avatar
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.

    – cib

    5. Juli 2015 um 17:02 Uhr

Benutzer-Avatar
Tim Pietzcker

Sie können verwenden dict.get()

value = d.get(key)

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.
     |  
    ...

Benutzer-Avatar
Daenyth

Verwenden dict.get

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.

Benutzer-Avatar
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:

class NoneDict(dict):
    def __getitem__(self, key):
        return dict.get(self, key)

>>> foo = NoneDict([(1,"asdf"), (2,"qwerty")])
>>> foo[1]
'asdf'
>>> foo[2]
'qwerty'
>>> foo[3] is None
True

  • @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

Benutzer-Avatar
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

Benutzer-Avatar
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

1130620cookie-checkGibt einen Standardwert zurück, wenn ein Wörterbuchschlüssel nicht verfügbar ist

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy