Was ist die dict.get()
Methode?
Wie bereits erwähnt, ist die get
Methode enthält einen zusätzlichen Parameter, der den fehlenden Wert angibt. Aus der Dokumentation
get(key[, default])
Rückgabe des Wertes für key, wenn key im Wörterbuch enthalten ist, sonst Standard. Wenn default nicht angegeben wird, ist es standardmäßig None, so dass diese Methode nie einen Fehler 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 Verbesserungen bei der Geschwindigkeit?
Wie erwähnt ici ,
Es scheint, dass alle drei Ansätze nun eine ähnliche Leistung aufweisen (innerhalb von etwa 10 % voneinander), mehr oder weniger unabhängig von den Eigenschaften der Wortliste.
Frühere get
war erheblich langsamer. Jetzt ist die Geschwindigkeit jedoch fast vergleichbar, mit dem zusätzlichen Vorteil, dass der Standardwert zurückgegeben wird. Um alle unsere Abfragen zu klären, können wir einen Test mit einer ziemlich großen Liste durchführen (beachten Sie, dass der Test nur die Suche nach allen gültigen Schlüsseln umfasst)
def getway(d):
for i in range(100):
s = d.get(i)
def lookup(d):
for i in range(100):
s = d[i]
Nun werden diese beiden Funktionen mit 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 der Lookup schneller als der Get, da es keinen Funktions-Lookup gibt. Dies ist zu erkennen durch 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 sie nützlich sein?
Sie ist immer dann nützlich, wenn Sie einen Standardwert angeben wollen, wenn Sie in einem Wörterbuch nachschlagen. 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 sie NICHT nützlich sein?
Wann immer Sie eine KeyError
die besagt, dass der betreffende 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, eine get
wie die Funktion in dict['key']
?
Ja! Wir müssen die __missing__
in einer dict-Unterklasse.
Ein Beispielprogramm kann sein
class MyDict(dict):
def __missing__(self, key):
return None
Eine kleine Demonstration kann sein
>>> my_d = MyDict({1:2,2:3})
>>> my_d[1]
2
>>> my_d[3]
>>> repr(my_d[3])
'None'