Warum dict.get(key) statt dict[key]?

Lesezeit: 10 Minuten

Benutzer-Avatar
stensootla

Heute bin ich auf die gestoßen dict Methode get die bei einem Schlüssel im Wörterbuch den zugehörigen Wert zurückgibt.

Für welchen Zweck ist diese Funktion sinnvoll? Wenn ich einen Wert finden möchte, der einem Schlüssel in einem Wörterbuch zugeordnet ist, kann ich das einfach tun dict[key]und es gibt dasselbe zurück:

dictionary = {"Name": "Harry", "Age": 17}
dictionary["Name"]
dictionary.get("Name")

Benutzer-Avatar
unutbu

Es ermöglicht Ihnen, einen Standardwert anzugeben, wenn der Schlüssel fehlt:

dictionary.get("bogus", default_value)

kehrt zurück default_value (was auch immer Sie wählen), während

dictionary["bogus"]

würde a erhöhen KeyError.

Wenn weggelassen, default_value ist Noneso dass

dictionary.get("bogus")  # <-- No default specified -- defaults to None

kehrt zurück None so wie

dictionary.get("bogus", None)

möchten.

  • Wäre dies dasselbe wie dictionary.get("bogus") or my_default? Ich habe gesehen, wie Leute es in einigen Fällen verwendet haben, und ich habe mich gefragt, ob es einen Vorteil gibt, das eine anstelle des anderen zu verwenden (außer der Lesbarkeit).

    – Algorithmisch

    4. Dezember 2015 um 21:57 Uhr

  • @MustafaS: Wenn "bogus" ist ein Schlüsseleingang dictionary und dictionary.get("bogus") gibt einen Wert zurück, der in einem booleschen Kontext zu False ausgewertet wird (dh ein Falsey-Wert), wie z. B. 0 oder eine leere Zeichenfolge, ''dann dictionary.get("bogus") or my_default würde zu bewerten my_default wohingegen dictionary.get("bogus", my_default) würde den Falsey-Wert zurückgeben. Also nein, dictionary.get("bogus") or my_default ist nicht gleichbedeutend mit dictionary.get("bogus", my_default). Welche Sie verwenden, hängt von dem gewünschten Verhalten ab.

    – unutbu

    4. Dezember 2015 um 22:22 Uhr


  • @MustafaS: Angenommen, zum Beispiel x = {'a':0}. Dann x.get('a', 'foo') kehrt zurück 0 aber x.get('a') or 'foo' kehrt zurück 'foo'.

    – unutbu

    4. Dezember 2015 um 22:27 Uhr

  • Eine mögliche Einschränkung bei der Verwendung dictionary.get('key'): Es kann verwirrend sein, wenn Werte im Wörterbuch stehen None. Ohne Angabe des Rückgabewerts (zweites optionales Argument) gibt es keine Möglichkeit zu überprüfen, ob der Schlüssel nicht existiert hat oder ob sein Wert vorhanden ist None. In diesem speziellen Fall würde ich die Verwendung in Betracht ziehen try-except-KeyError.

    – Aart Goossens

    17. Februar 2016 um 10:33 Uhr

  • Es ist erwähnenswert, dass der Ausdruck zum Angeben des Standardwerts im „get“-Aufruf ausgewertet wird und daher bei jedem Zugriff ausgewertet wird. Eine klassische Alternative (entweder mit einem KeyError-Handler oder einem Prädikat) besteht darin, den Standardwert nur auszuwerten, wenn der Schlüssel fehlt. Dadurch kann ein Abschluss/Lambda einmal erstellt und für jeden fehlenden Schlüssel ausgewertet werden.

    – Tom Stambaugh

    14. September 2018 um 19:22 Uhr


Benutzer-Avatar
Bhargav Rao

Was ist der dict.get() Methode?

Wie bereits erwähnt die get -Methode enthält einen zusätzlichen Parameter, der den fehlenden Wert angibt. Aus der Dokumentation

get(key[, default])

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 a auslöst KeyError.

Ein Beispiel kann sein

>>> d = {1:2,2:3}
>>> d[1]
2
>>> d.get(1)
2
>>> d.get(3)
>>> repr(d.get(3))
'None'
>>> d.get(3,1)
1

Gibt es irgendwo Geschwindigkeitsverbesserungen?

Wie erwähnt hier,

Es scheint, dass alle drei Ansätze jetzt eine ähnliche Leistung aufweisen (innerhalb von etwa 10 % voneinander), mehr oder weniger unabhängig von den Eigenschaften der Wortliste.

Vorhin get war erheblich langsamer, aber jetzt ist die Geschwindigkeit fast vergleichbar mit dem zusätzlichen Vorteil, dass der Standardwert zurückgegeben wird. Aber um alle unsere Abfragen zu löschen, können wir mit einer ziemlich großen Liste testen (Beachten Sie, dass der Test nur das Nachschlagen aller gültigen Schlüssel umfasst).

def getway(d):
    for i in range(100):
        s = d.get(i)

def lookup(d):
    for i in range(100):
        s = d[i]

Verwenden Sie nun das Timing dieser beiden Funktionen timeit

>>> import timeit
>>> print(timeit.timeit("getway({i:i for i in range(100)})","from __main__ import getway"))
20.2124660015
>>> print(timeit.timeit("lookup({i:i for i in range(100)})","from __main__ import lookup"))
16.16223979

Wie wir sehen können, ist die Suche schneller als die Get-Funktion, da es keine Funktionssuche gibt. Das kann man durchschauen dis

>>> def lookup(d,val):
...     return d[val]
... 
>>> def getway(d,val):
...     return d.get(val)
... 
>>> dis.dis(getway)
  2           0 LOAD_FAST                0 (d)
              3 LOAD_ATTR                0 (get)
              6 LOAD_FAST                1 (val)
              9 CALL_FUNCTION            1
             12 RETURN_VALUE        
>>> dis.dis(lookup)
  2           0 LOAD_FAST                0 (d)
              3 LOAD_FAST                1 (val)
              6 BINARY_SUBSCR       
              7 RETURN_VALUE  

Wo wird es nützlich sein?

Es ist nützlich, wenn Sie beim Nachschlagen in einem Wörterbuch einen Standardwert angeben möchten. Dies reduziert

 if key in dic:
      val = dic[key]
 else:
      val = def_val

Zu einer einzigen Zeile, val = dic.get(key,def_val)

Wo wird es NICHT nützlich sein?

Wann immer Sie a zurückgeben möchten KeyError mit der Angabe, dass der bestimmte Schlüssel nicht verfügbar ist. Die Rückgabe eines Standardwerts birgt auch das Risiko, dass ein bestimmter Standardwert auch ein Schlüssel sein kann!

Ist es möglich zu haben get wie Funktion in dict['key']?

Ja! Wir müssen die umsetzen __missing__ in einer dict-Unterklasse.

Ein Beispielprogramm kann sein

class MyDict(dict):
    def __missing__(self, key):
        return None

Eine kleine Vorführung kann sein

>>> my_d = MyDict({1:2,2:3})
>>> my_d[1]
2
>>> my_d[3]
>>> repr(my_d[3])
'None'

  • Playground-Link mit diesen Codes

    – Abhijeet

    7. April 2017 um 6:24 Uhr

  • Ein weiterer guter Test wäre if k in dict and dict[k]: vs if dict.get(k):. Dies deckt die Situation ab, in der wir prüfen müssen, ob ein Schlüssel vorhanden ist, und wenn “Ja” – welcher Wert?, etwa so: dict = {1: '', 2: 'some value'}.

    – TitanFighter

    16. September 2017 um 18:05 Uhr


  • Bitte denken Sie daran, dass der Standardwert unabhängig vom Wert im Wörterbuch ausgewertet wird, also statt dictionary.get(value, long_function()) man könnte erwägen, zu verwenden dictionary.get(value) or long_function()

    – Kresimir

    8. Mai 2018 um 10:34 Uhr

  • @Kresimir Die beiden Methoden sind nicht gleich, weil None oder ein False-y-Wert wäre der Standardwert, während dictionary.get() würde den Standardwert nur zurückgeben, wenn er fehlt.

    – Anonym

    21. November 2020 um 23:48 Uhr


  • Das collections Modul hat auch defaultdictsodass keine neue Klasse mehr geschrieben werden muss.

    – Karl-Wilhelm

    21. September 2021 um 14:46 Uhr

Benutzer-Avatar
Gefallener Engel

get nimmt einen zweiten optionalen Wert an. Wenn der angegebene Schlüssel in Ihrem Wörterbuch nicht vorhanden ist, wird dieser Wert zurückgegeben.

dictionary = {"Name": "Harry", "Age": 17}
dictionary.get('Year', 'No available data')
>> 'No available data'

Wenn Sie den zweiten Parameter nicht angeben, None Wird zurückgegeben.

Wenn Sie die Indizierung wie in verwenden dictionary['Year']werden nicht vorhandene Tasten ausgelöst KeyError.

Benutzer-Avatar
Benutzer1847

Ein Fallstrick, den Sie bei der Verwendung beachten sollten .get():

Wenn das Wörterbuch den im Aufruf verwendeten Schlüssel enthält .get() und sein Wert ist Nonedas .get() Methode wird zurückgegeben None auch wenn ein Standardwert angegeben ist.

Beispielsweise werden die folgenden zurückgegeben Nonenicht 'alt_value' wie zu erwarten:

d = {'key': None}
assert None is d.get('key', 'alt_value')

.get()Der zweite Wert von wird nur zurückgegeben, wenn der angegebene Schlüssel NICHT im Wörterbuch enthalten ist, nicht, wenn der Rückgabewert dieses Aufrufs vorhanden ist None.

Benutzer-Avatar
Kevin

Ich werde ein praktisches Beispiel für das Scraping von Webdaten mit Python geben. Oftmals erhalten Sie Schlüssel ohne Werte, in diesen Fällen erhalten Sie Fehler, wenn Sie ein Wörterbuch verwenden[‘key’]während dictionary.get(‘key’, ‘return_otherwise’) keine Probleme hat.

Ebenso würde ich ”.join(list) im Gegensatz zu list verwenden[0] wenn Sie versuchen, einen einzelnen Wert aus einer Liste zu erfassen.

ich hoffe es hilft.

[Edit] Hier ein praktisches Beispiel:

Angenommen, Sie rufen eine API auf, die eine JOSN-Datei zurückgibt, die Sie analysieren müssen. Das erste JSON sieht wie folgt aus:

{"bids":{"id":16210506,"submitdate":"2011-10-16 15:53:25","submitdate_f":"10\/16\/2011 at 21:53 CEST","submitdate_f2":"p\u0159ed 2 lety","submitdate_ts":1318794805,"users_id":"2674360","project_id":"1250499"}}

Der zweite JOSN ist wie folgt:

{"bids":{"id":16210506,"submitdate":"2011-10-16 15:53:25","submitdate_f":"10\/16\/2011 at 21:53 CEST","submitdate_f2":"p\u0159ed 2 lety","users_id":"2674360","project_id":"1250499"}}

Beachten Sie, dass dem zweiten JSON der Schlüssel „submitdate_ts“ fehlt, was in jeder Datenstruktur ziemlich normal ist.

Wenn Sie also versuchen, auf den Wert dieses Schlüssels in einer Schleife zuzugreifen, können Sie ihn folgendermaßen aufrufen:

for item in API_call:
    submitdate_ts = item["bids"]["submitdate_ts"]

Sie könnten, aber es wird Ihnen einen Rückverfolgungsfehler für die zweite JSON-Zeile geben, weil der Schlüssel einfach nicht existiert.

Die geeignete Art, dies zu codieren, könnte die folgende sein:

for item in API_call:
    submitdate_ts = item.get("bids", {'x': None}).get("submitdate_ts")

{‘x’: None} ist da, um zu vermeiden, dass die zweite Ebene einen Fehler bekommt. Natürlich können Sie beim Scraping mehr Fehlertoleranz in den Code einbauen. Wie zuerst die Angabe einer if-Bedingung

  • Eine gute Antwort, die vor allen anderen gepostet wurde und die mehr positiv bewertet und wahrscheinlich akzeptiert worden wäre, wenn Sie einige Codebeispiele gepostet hätten (+1 von mir)

    – Mawg sagt, Monica wieder einzusetzen

    3. März 2016 um 9:49 Uhr


  • @Mawg Ich hatte kürzlich ein Scraping-Projekt für meine Forschung. Es rief im Grunde eine API auf und analysierte JSON-Dateien. Ich habe es von meiner RA machen lassen. Eines der Hauptprobleme, das er hatte, war das direkte Aufrufen des Schlüssels, wenn tatsächlich viele Schlüssel fehlen. Ich werde ein Beispiel im Text oben posten.

    – Kevin

    13. August 2016 um 22:06 Uhr

  • vielen Dank, dass Sie sich mit dem multidimensionalen Aspekt befasst haben! Klingt so, als könnten Sie sogar einfach {} statt {‘x’: None} machen

    – bluppfisk

    3. Dezember 2017 um 16:56 Uhr


Benutzer-Avatar
SiHa

Der Zweck ist, dass Sie einen Standardwert angeben können, wenn der Schlüssel nicht gefunden wird, was sehr nützlich ist

dictionary.get("Name",'harry')

  • Eine gute Antwort, die vor allen anderen gepostet wurde und die mehr positiv bewertet und wahrscheinlich akzeptiert worden wäre, wenn Sie einige Codebeispiele gepostet hätten (+1 von mir)

    – Mawg sagt, Monica wieder einzusetzen

    3. März 2016 um 9:49 Uhr


  • @Mawg Ich hatte kürzlich ein Scraping-Projekt für meine Forschung. Es rief im Grunde eine API auf und analysierte JSON-Dateien. Ich habe es von meiner RA machen lassen. Eines der Hauptprobleme, das er hatte, war das direkte Aufrufen des Schlüssels, wenn tatsächlich viele Schlüssel fehlen. Ich werde ein Beispiel im Text oben posten.

    – Kevin

    13. August 2016 um 22:06 Uhr

  • vielen Dank, dass Sie sich mit dem multidimensionalen Aspekt befasst haben! Klingt so, als könnten Sie sogar einfach {} statt {‘x’: None} machen

    – bluppfisk

    3. Dezember 2017 um 16:56 Uhr


Benutzer-Avatar
Daniel Holmes

Für welchen Zweck ist diese Funktion sinnvoll?

Eine besondere Verwendung ist das Zählen mit einem Wörterbuch. Nehmen wir an, Sie möchten die Anzahl der Vorkommen jedes Elements in einer gegebenen Liste zählen. Der übliche Weg, dies zu tun, besteht darin, ein Wörterbuch zu erstellen, in dem Schlüssel Elemente und Werte die Anzahl der Vorkommen sind.

fruits = ['apple', 'banana', 'peach', 'apple', 'pear']
d = {}
for fruit in fruits:
    if fruit not in d:
        d[fruit] = 0
    d[fruit] += 1

Verwendung der .get() -Methode können Sie diesen Code kompakter und übersichtlicher gestalten:

for fruit in fruits:
    d[fruit] = d.get(fruit, 0) + 1

  • Dies ist zwar wahr, aber denken Sie daran d = defaultdict(int) ist noch sauberer. Innere Schleife wird d[fruit] += 1. Dann wieder wahrscheinlich collections.Counter ist noch besser als die defaultdict Ausführung. Das .get Version kann immer noch nützlich sein, wenn Sie eine nicht konvertieren möchten Counter oder defaultdict zurück zu a dict oder sowas ähnliches.

    – ggorlen

    19. Dezember 2020 um 4:06 Uhr


1145600cookie-checkWarum dict.get(key) statt dict[key]?

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

Privacy policy