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 ?

333
demandé sur mshell_lauren 2011-05-26 00:49:52

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")
556
répondu Tim Pietzcker 2014-06-07 15:17:57

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.
     |  
    ...
55
répondu John La Rooy 2011-05-25 21:37:08

Utiliser dict.get

20
répondu Daenyth 2011-05-25 20:51:49

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.

16
répondu dusktreader 2016-07-30 23:58:40

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
15
répondu Björn Pollex 2011-05-25 21:00:24

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'
9
répondu job 2017-03-31 19:20:56

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
4
répondu Marek P 2011-05-25 21:00:47

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.

4
répondu martineau 2011-05-25 22:07:23

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']
1
répondu imapotatoe123 2018-05-29 18:20:12

Si vous pouvez le faire avec False, alors, il y a aussi la fonction intégrée hasattr :

e=dict()
hasattr(e, 'message'):
>>> False
-1
répondu Evhz 2018-05-15 14:35:42

Vous pouvez remplacer __missing__(self, key) en sous-classant dict et en renvoyant None.

class MyDict(dict):
    def __missing__(self, key):
        return None
-2
répondu Prashant Nair 2018-01-23 18:01:48