J'ai besoin d'un moyen d'obtenir une valeur de dictionnaire si sa clé existe, ou simplement de retourner None
, si ce n'est pas le cas.
Cependant, Python lève une exception KeyError
si vous recherchez une clé inexistante. Je sais que je peux vérifier la clé, mais je cherche quelque chose de plus explicite. Existe-t-il un moyen de renvoyer None
si la clé n'existe pas?
Vous pouvez utiliser get()
value = d.get(key)
qui retournera None
si key is not in d
. Vous pouvez également fournir une valeur par défaut différente qui sera renvoyée à la place de None
:
value = d.get(key, "empty")
Je ne me demande plus. C'est intégré dans la langue.
>>> help (dict) Aide sur le dict de classe dans les modules intégrés: class dict (objet) | dict () -> nouveau dictionnaire vide | dict (mapping) -> nouveau dictionnaire initialisé à partir de | (clé, valeur) paires ... | | get (...) | D.get (k [ d]) -> D [k] si k dans D, sinon d. La valeur par défaut de d est Aucune. | ...
Utilisez dict.get
Vous devriez utiliser la méthode get()
de la classe dict
d = {}
r = d.get( 'missing_key', None )
Cela donnera r == None
. Si la clé ne se trouve pas dans le dictionnaire, la fonction get renvoie le deuxième argument.
Si vous voulez une solution plus transparente, vous pouvez sous-classe dict
pour obtenir ce comportement:
class NoneDict(dict):
def __getitem__(self, key):
return dict.get(self, key)
>>> foo = NoneDict([(1,"asdf"), (2,"qwerty")])
>>> foo[1]
'asdf'
>>> foo[2]
'qwerty'
>>> foo[3] is None
True
J'utilise habituellement un defaultdict pour des situations comme celle-ci. Vous fournissez une méthode d'usine qui ne prend aucun argument et crée une valeur lorsqu'elle voit une nouvelle clé. C'est plus utile quand vous voulez retourner quelque chose comme une liste vide sur de nouvelles clés ( voir les exemples ).
from collections import defaultdict
d = defaultdict(lambda: None)
print d['new_key'] # prints 'None'
Vous pouvez utiliser la méthode get()
d'un objet dict
, comme d'autres l'ont déjà suggéré. Alternativement, en fonction de ce que vous faites, vous pourrez peut-être utiliser une suite try/except
comme ceci:
try:
<to do something with d[key]>
except KeyError:
<deal with it not being there>
Ce qui est considéré comme une approche très "pythonique" du traitement du cas.
Une solution en une ligne serait:
item['key'] if 'key' in item else None
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.
row = [item['key'] if 'key' in item else 'default_value']
Comme d'autres l'ont dit plus haut, vous pouvez utiliser get ().
Mais pour vérifier une clé, vous pouvez aussi faire:
d = {}
if 'keyname' in d:
# d['keyname'] exists
pass
else:
# d['keyname'] does not exist
pass