Qual è il dict.get()
metodo?
Come già accennato, il get
metodo contiene un parametro aggiuntivo che indica il valore mancante. Dalla documentazione
get(key[, default])
Restituisce il valore per chiave se chiave è nel dizionario, altrimenti impostazione predefinita. Se non viene fornito il valore predefinito, il valore predefinito è Nessuno, quindi questo metodo non genera mai a KeyError
.
Un esempio può essere
>>> 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
Ci sono miglioramenti di velocità ovunque?
Come menzionato qui ,
Sembra che tutti e tre gli approcci mostrino ora prestazioni simili (entro circa il 10% l'una dall'altra), più o meno indipendenti dalle proprietà dell'elenco di parole.
In precedenza get
era considerevolmente più lento, tuttavia ora la velocità è quasi comparabile con l'ulteriore vantaggio di restituire il valore predefinito. Ma per cancellare tutte le nostre domande, possiamo testare su un elenco abbastanza grande (Nota che il test include solo la ricerca di tutte le chiavi valide)
def getway(d):
for i in range(100):
s = d.get(i)
def lookup(d):
for i in range(100):
s = d[i]
Ora cronometrando queste due funzioni usando 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
Come possiamo vedere, la ricerca è più veloce di get in quanto non esiste una ricerca di funzioni. Questo può essere visto attraversodis
>>> 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
Dove sarà utile?
Sarà utile ogni volta che desideri fornire un valore predefinito ogni volta che cerchi un dizionario. Questo riduce
if key in dic:
val = dic[key]
else:
val = def_val
Su una sola riga, val = dic.get(key,def_val)
Dove NON sarà utile?
Ogni volta che si desidera restituire una KeyError
dichiarazione che la chiave particolare non è disponibile. Restituire un valore predefinito comporta anche il rischio che anche un determinato valore predefinito possa essere una chiave!
È possibile avere get
funzionalità simili in dict['key']
?
Sì! Dobbiamo implementare la __missing__
sottoclasse in in dict.
Un programma di esempio può essere
class MyDict(dict):
def __missing__(self, key):
return None
Una piccola dimostrazione può essere
>>> my_d = MyDict({1:2,2:3})
>>> my_d[1]
2
>>> my_d[3]
>>> repr(my_d[3])
'None'
dictionary["foo"]
edictionary.get("foo")
comportarsi diversamente, però.