Heute bin ich auf die dict
Methode get
gestoßen, die bei einem Schlüssel im Wörterbuch den zugehörigen Wert zurückgibt.
Für welchen Zweck ist diese Funktion nützlich? Wenn ich einen Wert finden wollte, der einem Schlüssel in einem Wörterbuch zugeordnet ist, kann ich dies einfach tun dict[key]
, und es wird dasselbe zurückgegeben:
dictionary = {"Name": "Harry", "Age": 17}
dictionary["Name"]
dictionary.get("Name")
python
dictionary
stensootla
quelle
quelle
dictionary["foo"]
unddictionary.get("foo")
verhalten sich jedoch anders.dictionary.get("Age")
ist dasselbe wie das Schreiben,dictionary["Age"] or None
daher wird die KeyError-Ausnahme implizit behandeltdictionary['non-existent key'] or None
sollte und muss trotzdem einenKeyError
für mich auslösen (bis v3.6). Können Sie erklären, was Sie meinen?Antworten:
Sie können einen Standardwert angeben, wenn der Schlüssel fehlt:
gibt zurück
default_value
(was auch immer Sie wählen)würde ein erhöhen
KeyError
.Wenn weggelassen,
default_value
istNone
, so dasskehrt
None
genauso zurück wiewürde.
quelle
dictionary.get("bogus") or my_default
? Ich habe gesehen, wie Leute es in einigen Fällen benutzten, und ich habe mich gefragt, ob es einen Vorteil gibt, eines anstelle des anderen zu verwenden (außer Lesbarkeit)"bogus"
ein Schlüssel eingegeben wirddictionary
unddictionary.get("bogus")
ein Wert zurückgegeben wird, der in einem booleschen Kontext (dh einem Falsey-Wert) als False ausgewertet wird, z. B. 0 oder eine leere Zeichenfolge,''
wirddictionary.get("bogus") or my_default
ausgewertet,my_default
während währenddictionary.get("bogus", my_default)
der Falsey-Wert zurückgegeben wird. Also nein,dictionary.get("bogus") or my_default
ist nicht gleichbedeutend mitdictionary.get("bogus", my_default)
. Welche Sie verwenden möchten, hängt vom gewünschten Verhalten ab.x = {'a':0}
. Dannx.get('a', 'foo')
kehrt0
aberx.get('a') or 'foo'
zurück'foo'
.dictionary.get('key')
: Es kann verwirrend sein, ob Werte im Wörterbuch vorhanden sindNone
. Ohne Angabe des Rückgabewerts (zweites optionales Argument) kann nicht überprüft werden, ob der Schlüssel nicht vorhanden war oder ob sein Wert vorhanden istNone
. In diesem speziellen Fall würde ich in Betracht ziehen, zu verwendentry-except-KeyError
.Wie bereits erwähnt
get
, enthält die Methode einen zusätzlichen Parameter, der den fehlenden Wert angibt. Aus der DokumentationEin Beispiel kann sein
Wie hier erwähnt ,
Früher
get
war es erheblich langsamer, jetzt ist die Geschwindigkeit jedoch fast vergleichbar, zusammen mit dem zusätzlichen Vorteil, den Standardwert zurückzugeben. Um alle unsere Abfragen zu löschen, können wir auf einer ziemlich großen Liste testen (Beachten Sie, dass der Test nur das Nachschlagen aller gültigen Schlüssel umfasst).Jetzt Timing dieser beiden Funktionen mit
timeit
Wie wir sehen können, ist die Suche schneller als die get, da es keine Funktionssuche gibt. Dies kann durchschaut werden
dis
Dies ist immer dann hilfreich, wenn Sie einen Standardwert angeben möchten, wenn Sie ein Wörterbuch nachschlagen. Dies reduziert sich
Zu einer einzelnen Zeile,
val = dic.get(key,def_val)
Wann immer Sie eine
KeyError
Erklärung zurückgeben möchten , dass der bestimmte Schlüssel nicht verfügbar ist. Die Rückgabe eines Standardwerts birgt auch das Risiko, dass ein bestimmter Standardwert ebenfalls ein Schlüssel sein kann!Ja! Wir müssen das
__missing__
in einer Diktat-Unterklasse implementieren .Ein Beispielprogramm kann sein
Eine kleine Demonstration kann sein
quelle
if k in dict and dict[k]:
vsif dict.get(k):
. Dies deckt die Situation ab, in der überprüft werden muss, ob ein Schlüssel vorhanden ist, und wenn 'Ja' - welcher Wert?, So etwas wie :dict = {1: '', 2: 'some value'}
.dictionary.get(value, long_function())
einer Verwendung könnte prüfendictionary.get(value) or long_function()
get
nimmt einen zweiten optionalen Wert an. Wenn der angegebene Schlüssel in Ihrem Wörterbuch nicht vorhanden ist, wird dieser Wert zurückgegeben.Wenn Sie den zweiten Parameter nicht angeben,
None
wird zurückgegeben.Wenn Sie die Indizierung wie in verwenden
dictionary['Year']
, werden nicht vorhandene Schlüssel ausgelöstKeyError
.quelle
Ich werde ein praktisches Beispiel für das Scraping von Webdaten mit Python geben. In vielen Fällen erhalten Sie Schlüssel ohne Werte. In diesen Fällen werden Fehler angezeigt, wenn Sie das Wörterbuch ['key'] verwenden, während dictionary.get ('key ',' return_otherwise ') hat keine Probleme.
Ebenso würde ich '' .join (Liste) im Gegensatz zu Liste [0] verwenden, wenn Sie versuchen, einen einzelnen Wert aus einer Liste zu erfassen.
ich hoffe es hilft.
[Bearbeiten] Hier ist ein praktisches Beispiel:
Angenommen, Sie rufen eine API auf, die eine JOSN-Datei zurückgibt, die Sie analysieren müssen. Der erste JSON sieht folgendermaßen aus:
Der zweite JOSN ist wie folgt:
Beachten Sie, dass dem zweiten JSON der Schlüssel "submitdate_ts" fehlt, was in jeder Datenstruktur ziemlich normal ist.
Wenn Sie also versuchen, in einer Schleife auf den Wert dieses Schlüssels zuzugreifen, können Sie ihn wie folgt aufrufen:
Sie könnten, aber es wird Ihnen einen Traceback-Fehler für die zweite JSON-Zeile geben, da der Schlüssel einfach nicht existiert.
Die geeignete Art, dies zu codieren, könnte die folgende sein:
{'x': Keine} ist vorhanden, um zu vermeiden, dass die zweite Ebene einen Fehler erhält. Natürlich können Sie beim Scraping mehr Fehlertoleranz in den Code einbauen. Wie zuerst eine if-Bedingung angeben
quelle
Der Zweck ist, dass Sie einen Standardwert angeben können, wenn der Schlüssel nicht gefunden wird, was sehr nützlich ist
quelle
Eine besondere Verwendung ist das Zählen mit einem Wörterbuch. Angenommen, Sie möchten die Anzahl der Vorkommen jedes Elements in einer bestimmten 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.
Mit der
.get()
Methode können Sie diesen Code kompakter und klarer gestalten:quelle
Ein Gotcha, das Sie beachten sollten, wenn Sie Folgendes verwenden
.get()
:Wenn das Wörterbuch den im Aufruf von verwendeten Schlüssel enthält
.get()
und dessen Wert lautetNone
, gibt die.get()
Methode auch dann zurückNone
, wenn ein Standardwert angegeben wird.Die folgenden Ergebnisse
None
werden beispielsweise nicht'alt_value'
wie erwartet zurückgegeben:.get()
Der zweite Wert wird nur zurückgegeben, wenn sich der angegebene Schlüssel NICHT im Wörterbuch befindet, nicht wenn der Rückgabewert dieses Aufrufs lautetNone
.quelle
d.get('key') or 'alt_value'
wenn Sie wissen, dass es sein könnteNone
0. Zusammenfassung
Im Vergleich zu
dict[key]
,dict.get
stellt einen Fehlerwert , wenn für einen Schlüssel aufzuzublicken.1. Definition
get (key [, default]) 4. Integrierte Typen - Python 3.6.4rc1-Dokumentation
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.
2. Problem, das es löst.
Wenn nicht
default value
, müssen Sie umständliche Codes schreiben, um eine solche Ausnahme zu behandeln.dict.get
Führt als bequeme Lösung einen optionalen Standardwert ein, der die oben genannten ungewollten Codes vermeidet.3. Fazit
dict.get
verfügt über eine zusätzliche Standardwertoption zur Behandlung von Ausnahmen, wenn der Schlüssel im Wörterbuch nicht vorhanden istquelle
Ein Unterschied, der von Vorteil sein kann, besteht darin, dass wir, wenn wir nach einem Schlüssel suchen, der nicht existiert, None erhalten, nicht wie bei Verwendung der Klammernotation. In diesem Fall wird ein Fehler ausgegeben:
Das Letzte, was an der get-Methode cool ist, ist, dass sie ein zusätzliches optionales Argument für einen Standardwert erhält, dh wenn wir versucht haben, den Bewertungswert eines Schülers abzurufen, der Schüler jedoch keinen Bewertungsschlüssel hat, den wir abrufen können stattdessen eine 0.
Also anstatt dies zu tun (oder etwas Ähnliches):
Wir können das schaffen:
quelle
Basierend auf der Verwendung sollte diese
get
Methode verwendet werden.Beispiel 1
Beispiel2
quelle