Renvoie None si la clé du dictionnaire n'est pas disponible
J'ai besoin d'un moyen d'obtenir une valeur de dictionnaire si sa existe, ou tout simplement de retour Aucun, si ce n'est pas.
Cependant, Python renvoie un key_error 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. Est-il un moyen de le renvoyer None si la clé n'existe pas ?
11 réponses
, 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 au lieu de None
:
value = d.get(key, "empty")
Ne me demande plus. Il est intégré dans la langue.
>>> help(dict) Help on class dict in module builtins: class dict(object) | dict() -> new empty dictionary | dict(mapping) -> new dictionary initialized from a mapping object's | (key, value) pairs ... | | get(...) | D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None. | ...
Vous devez utiliser la méthode get()
de la classe dict
d = {}
r = d.get( 'missing_key', None )
Cela donnera r == None
. Si la clé n'est pas trouvée 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 factory qui ne prend aucun argument et crée une valeur lorsqu'elle voit une nouvelle clé. Il est plus utile lorsque 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'
Comme d'autres l'ont dit plus haut, vous pouvez utiliser get().
Mais pour vérifier une clé, vous pouvez également faire:
d = {}
if 'keyname' in d:
# d['keyname'] exists
pass
else:
# d['keyname'] does not exist
pass
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 exactement, vous pouvez utiliser une suite try/except
comme ceci:
try:
<to do something with d[key]>
except KeyError:
<deal with it not being there>
Qui est considéré comme une approche très "pythonique" pour gérer le cas.
Une solution à 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']
Vous pouvez remplacer __missing__(self, key)
en sous-classant dict et en renvoyant None.
class MyDict(dict):
def __missing__(self, key):
return None