Was ist die dict.get()
Methode?
Wie bereits erwähnt get
, enthält die Methode einen zusätzlichen Parameter, der den fehlenden Wert angibt. Aus der Dokumentation
get(key[, default])
Gibt den Wert für key zurück, wenn sich key im Wörterbuch befindet, andernfalls standardmäßig. Wenn keine Standardeinstellung 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 hier erwähnt ,
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.
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).
def getway(d):
for i in range(100):
s = d.get(i)
def lookup(d):
for i in range(100):
s = d[i]
Jetzt Timing dieser 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 die Suche schneller als die get, da es keine Funktionssuche gibt. Dies kann durchschaut werdendis
>>> 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?
Dies ist immer dann hilfreich, wenn Sie einen Standardwert angeben möchten, wenn Sie ein Wörterbuch nachschlagen. Dies reduziert sich
if key in dic:
val = dic[key]
else:
val = def_val
Zu einer einzelnen Zeile, val = dic.get(key,def_val)
Wo wird es NICHT nützlich sein?
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!
Ist es möglich, get
ähnliche Funktionen zu haben dict['key']
?
Ja! Wir müssen das __missing__
in einer Diktat-Unterklasse implementieren .
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'
dictionary["foo"]
unddictionary.get("foo")
verhalten sich jedoch anders.