web-dev-qa-db-fra.com

Renvoyer Aucun si la clé du dictionnaire n'est pas disponible.

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?

414
Spyros

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")
692
Tim Pietzcker

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. 
 | 
 ... 
62
John La Rooy

Utilisez dict.get

23
Daenyth

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.

18
dusktreader

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
17
Björn Pollex

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'
10
job

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.

8
martineau

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']
6
imapotatoe123

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
4
Marek P