Quelle est la dict.get()
méthode?
Comme déjà mentionné, la get
méthode contient un paramètre supplémentaire qui indique la valeur manquante. De la documentation
get(key[, default])
Renvoie la valeur de key si key est dans le dictionnaire, sinon par défaut. Si la valeur par défaut n'est pas indiquée, elle est définie par défaut sur None, de sorte que cette méthode ne déclenche jamais a KeyError
.
Un exemple peut être
>>> 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
Y a-t-il des améliorations de vitesse quelque part?
Comme mentionné ici ,
Il semble que les trois approches présentent désormais des performances similaires (à environ 10% l'une de l'autre), plus ou moins indépendantes des propriétés de la liste de mots.
Plus tôt get
était considérablement plus lent, mais maintenant la vitesse est presque comparable avec l'avantage supplémentaire de retourner la valeur par défaut. Mais pour effacer toutes nos requêtes, nous pouvons tester sur une liste assez longue (Notez que le test inclut la recherche de toutes les clés valides uniquement)
def getway(d):
for i in range(100):
s = d.get(i)
def lookup(d):
for i in range(100):
s = d[i]
Maintenant, chronométrez ces deux fonctions en utilisant 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
Comme nous pouvons le voir, la recherche est plus rapide que le get car il n'y a pas de recherche de fonction. Cela peut être vu à traversdis
>>> 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
Où cela sera-t-il utile?
Il sera utile chaque fois que vous souhaitez fournir une valeur par défaut chaque fois que vous recherchez un dictionnaire. Cela réduit
if key in dic:
val = dic[key]
else:
val = def_val
Sur une seule ligne, val = dic.get(key,def_val)
Où ne sera-t-il PAS utile?
Chaque fois que vous souhaitez retourner un KeyError
indiquant que la clé particulière n'est pas disponible. Le retour d'une valeur par défaut comporte également le risque qu'une valeur par défaut particulière soit également une clé!
Est-il possible d'avoir une get
fonctionnalité similaire dans dict['key']
?
Oui! Nous devons implémenter la __missing__
sous-classe in a dict.
Un exemple de programme peut être
class MyDict(dict):
def __missing__(self, key):
return None
Une petite démonstration peut être
>>> my_d = MyDict({1:2,2:3})
>>> my_d[1]
2
>>> my_d[3]
>>> repr(my_d[3])
'None'
dictionary["foo"]
etdictionary.get("foo")
se comportent différemment, cependant.