J'ai besoin d'un moyen pour obtenir une valeur de dictionnaire si sa clé existe, ou simplement retourner None
, sinon.
Cependant, Python lève une KeyError
exception si vous recherchez une clé qui n'existe pas. Je sais que je peux vérifier la clé, mais je cherche quelque chose de plus explicite. Existe-t-il un moyen de simplement revenir None
si la clé n'existe pas?
python
dictionary
key
nonetype
Spyros
la source
la source
.get(key)
au lieu de[key]
Réponses:
Vous pouvez utiliser
dict.get()
qui reviendra
None
sikey is not in d
. Vous pouvez également fournir une valeur par défaut différente qui sera retournée au lieu deNone
:la source
None
si la clé est explicitement mappéeNone
dans le dict. Si ce n'est pas ce que vous voulez, vous pouvez utiliser quelque chose commed.get(key) or "empty"
.[]
,""
,False
,0.0
ou bienNone
), alors votre solution retournerait toujours0
. Si vous attendezNone
s comme valeurs, vous devrez faire laif key in d:
vérification explicitement."empty"
est retourné s'ilkey
ne s'agit pas d'une clé valided
. Cela n'a rien à voir avec la valeurkey
mappée.Je ne me demande plus. C'est intégré à la langue.
la source
Utilisation
dict.get
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.
la source
Vous devez utiliser la
get()
méthode de ladict
classeCela se traduira par
r == None
. Si la clé n'est pas trouvée dans le dictionnaire, la fonction get renvoie le deuxième argument.la source
None
explicitement. C'est la valeur par défaut.Si vous voulez une solution plus transparente, vous pouvez sous-classer
dict
pour obtenir ce comportement:la source
defaultdict
est qu'il augmentera à chaque fois qu'un élément qui n'est pas encore là est demandé. Ce n'est pas toujours souhaitable.foo['bar']['test']['sss']
revenirNone
au lieu d'exception, après une profondeur, il commence à donnerTypeError
au lieu deKeyError
NoneDicts
. Cela aiderait au cas oùKeyError
cela se produirait dans l'objet le plus intérieur. Sinon, le problème est qu'une fois que vous retournez unNone
objet, vous ne pouvez plus y souscrire. Un hack laid serait de retourner un autre objet qui teste commeNone
. Attention cependant, cela pourrait conduire à des bugs horribles.return dict.get(self, key)
àreturn super().get(key)
? Ensuite, si je décide d'utiliser OrderedDict au lieu de dict, par exemple, je n'ai pas à me soucier de changer plusieurs lignes de code.J'utilise généralement un défaut par défaut pour des situations comme celle-ci. Vous fournissez une méthode d'usine qui ne prend aucun argument et crée une valeur lorsqu'il voit une nouvelle clé. C'est plus utile lorsque vous souhaitez renvoyer quelque chose comme une liste vide sur de nouvelles clés ( voir les exemples ).
la source
defaultdict
est qu'il continuera de croître chaque fois qu'un élément inexistant est demandé.Vous pouvez utiliser
dict
laget()
méthode d' un objet , comme d'autres l'ont déjà suggéré. Alternativement, selon exactement ce que vous faites, vous pourrez peut-être utiliser unetry/except
suite comme celle-ci:Ce qui est considéré comme une approche très "Pythonique" pour gérer le cas.
la source
Une solution sur une seule ligne serait:
Ceci est utile lorsque vous essayez d'ajouter des valeurs de dictionnaire à une nouvelle liste et que vous souhaitez fournir une valeur par défaut:
par exemple.
la source
Comme d'autres l'ont dit plus haut, vous pouvez utiliser get ().
Mais pour vérifier une clé, vous pouvez également faire:
la source
get
méthode.J'ai été abasourdi par ce qui était possible en python2 vs python3. Je vais y répondre en fonction de ce que j'ai fini par faire pour python3. Mon objectif était simple: vérifier si une réponse json au format dictionnaire donnait une erreur ou non. Mon dictionnaire s'appelle "token" et ma clé que je recherche est "error". Je recherche la clé "erreur" et si elle n'était pas là, la définissant sur la valeur None, alors je vérifie que la valeur est None, si c'est le cas, continuez avec mon code. Une instruction else serait gérée si j'ai la clé "erreur".
la source
Si vous pouvez le faire avec
False
, alors, il y a aussi la fonction intégrée hasattr :la source