Aujourd'hui, je suis tombé sur la dict
méthode get
qui, étant donné une clé dans le dictionnaire, renvoie la valeur associée.
Dans quel but cette fonction est-elle utile? Si je voulais trouver une valeur associée à une clé dans un dictionnaire, je peux simplement le faire dict[key]
, et cela renvoie la même chose:
dictionary = {"Name": "Harry", "Age": 17}
dictionary["Name"]
dictionary.get("Name")
python
dictionary
stensootla
la source
la source
dictionary["foo"]
etdictionary.get("foo")
se comportent différemment, cependant.dictionary.get("Age")
est identique à l'écriture,dictionary["Age"] or None
donc il gère implicitement l'exception KeyErrordictionary['non-existent key'] or None
soulève toujours unKeyError
pour moi (jusqu'à la v3.6). Pouvez-vous expliquer ce que vous voulez dire?Réponses:
Il vous permet de fournir une valeur par défaut si la clé est manquante:
retourne
default_value
(quel que soit votre choix), tandis quesoulèverait un
KeyError
.Si omis,
default_value
estNone
tel querenvoie
None
commeaurait.
la source
dictionary.get("bogus") or my_default
? J'ai vu des gens l'utiliser dans certains cas et je me demandais s'il y avait un avantage à utiliser l'un au lieu de l'autre (autre que la lisibilité)"bogus"
est une clédictionary
etdictionary.get("bogus")
renvoie une valeur qui est évaluée à False dans un contexte booléen (c'est-à-dire une valeur Falsey), telle que 0 ou une chaîne vide,,''
alorsdictionary.get("bogus") or my_default
évalueraitmy_default
alorsdictionary.get("bogus", my_default)
que retournerait la valeur Falsey. Donc non, cedictionary.get("bogus") or my_default
n'est pas équivalent àdictionary.get("bogus", my_default)
. Lequel utiliser dépend du comportement que vous désirez.x = {'a':0}
.x.get('a', 'foo')
Retourne ensuite0
maisx.get('a') or 'foo'
revient'foo'
.dictionary.get('key')
: Cela peut être déroutant si les valeurs du dictionnaire le sontNone
. Sans spécifier la valeur de retour (deuxième argument facultatif), il n'y a aucun moyen de vérifier si la clé n'existait pas ou si sa valeur estNone
. Dans ce cas précis, j'envisagerais d'utilisertry-except-KeyError
.Comme déjà mentionné, la
get
méthode contient un paramètre supplémentaire qui indique la valeur manquante. De la documentationUn exemple peut être
Comme mentionné ici ,
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)Maintenant, chronométrez ces deux fonctions en utilisant
timeit
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 à travers
dis
Il sera utile chaque fois que vous souhaitez fournir une valeur par défaut chaque fois que vous recherchez un dictionnaire. Cela réduit
Sur une seule ligne,
val = dic.get(key,def_val)
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é!Oui! Nous devons implémenter la
__missing__
sous-classe in a dict.Un exemple de programme peut être
Une petite démonstration peut être
la source
if k in dict and dict[k]:
vsif dict.get(k):
. Cette garantie couvre la situation où nous devons vérifier si la clé existe, et si « oui » - quelle valeur ?, quelque chose comme:dict = {1: '', 2: 'some value'}
.dictionary.get(value, long_function())
envisager d'utiliserdictionary.get(value) or long_function()
get
prend une deuxième valeur facultative. Si la clé spécifiée n'existe pas dans votre dictionnaire, cette valeur sera renvoyée.Si vous ne donnez pas le deuxième paramètre,
None
sera retourné.Si vous utilisez l'indexation comme dans
dictionary['Year']
, les clés inexistantes augmenterontKeyError
.la source
Je vais vous donner un exemple pratique de grattage de données Web à l'aide de python, la plupart du temps, vous obtiendrez des clés sans valeurs, dans ces cas, vous obtiendrez des erreurs si vous utilisez dictionnaire ['clé'], tandis que dictionnaire.get ('clé ',' return_otherwise ') n'a aucun problème.
De même, j'utiliserais '' .join (list) par opposition à list [0] si vous essayez de capturer une seule valeur d'une liste.
J'espère que cela aide.
[Modifier] Voici un exemple pratique:
Dites, vous appelez une API, qui renvoie un fichier JOSN que vous devez analyser. Le premier JSON ressemble à ceci:
Le deuxième JOSN est comme ceci:
Notez que le deuxième JSON n'a pas la clé "submitdate_ts", ce qui est assez normal dans n'importe quelle structure de données.
Ainsi, lorsque vous essayez d'accéder à la valeur de cette clé dans une boucle, pouvez-vous l'appeler comme suit:
Vous pourriez, mais cela vous donnera une erreur de trace pour la deuxième ligne JSON, car la clé n'existe tout simplement pas.
La manière appropriée de coder cela pourrait être la suivante:
{'x': Aucun} est là pour éviter que le deuxième niveau ne reçoive une erreur. Bien sûr, vous pouvez intégrer davantage de tolérance aux pannes dans le code si vous effectuez un grattage. Comme en spécifiant d'abord une condition if
la source
Le but est que vous puissiez donner une valeur par défaut si la clé n'est pas trouvée, ce qui est très utile
la source
Un piège à connaître lors de l'utilisation
.get()
:Si le dictionnaire contient la clé utilisée dans l'appel à
.get()
et que sa valeur estNone
, la.get()
méthode retourneraNone
même si une valeur par défaut est fournie.Par exemple, les retours suivants
None
, pas'alt_value'
comme on peut s'y attendre:.get()
La deuxième valeur de 'est retournée uniquement si la clé fournie n'est PAS dans le dictionnaire, pas si la valeur de retour de cet appel l'estNone
.la source
d.get('key') or 'alt_value'
si vous savez que cela pourrait êtreNone
Une utilisation particulière consiste à compter avec un dictionnaire. Supposons que vous souhaitiez compter le nombre d'occurrences de chaque élément dans une liste donnée. La manière la plus courante de le faire est de créer un dictionnaire où les clés sont des éléments et les valeurs le nombre d'occurrences.
En utilisant la
.get()
méthode, vous pouvez rendre ce code plus compact et plus clair:la source
0. Résumé
Par rapport à
dict[key]
,dict.get
fournit une valeur de secours lors de la recherche d'une clé.1. Définition
get (clé [, par défaut]) 4. Types intégrés - Documentation Python 3.6.4rc1
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 une erreur KeyError.
2. Problème qu'il résout.
Si ce n'est pas le cas
default value
, vous devez écrire des codes lourds pour gérer une telle exception.En tant que solution pratique,
dict.get
introduit une valeur par défaut facultative en évitant les codes involontaires ci-dessus.3. Conclusion
dict.get
a une option de valeur par défaut supplémentaire pour traiter l'exception si la clé est absente du dictionnairela source
Une différence, qui peut être un avantage, est que si nous recherchons une clé qui n'existe pas, nous obtiendrons None, pas comme lorsque nous utilisons la notation des crochets, auquel cas nous obtiendrons une erreur:
La dernière chose intéressante à propos de la méthode get, c'est qu'elle reçoit un argument facultatif supplémentaire pour une valeur par défaut, c'est-à-dire si nous avons essayé d'obtenir la valeur de score d'un étudiant, mais que l'étudiant n'a pas de clé de score que nous pouvons obtenir un 0 à la place.
Donc au lieu de faire ça (ou quelque chose de similaire):
Nous pouvons le faire:
la source
Basé sur l'utilisation devrait utiliser cette
get
méthode.Exemple 1
Exemple2
la source