Question Vérifier si une clé existe déjà dans un dictionnaire


Je voulais tester si une clé existe dans un dictionnaire avant de mettre à jour la valeur de la clé. J'ai écrit le code suivant:

if 'key1' in dict.keys():
  print "blah"
else:
  print "boo"

Je pense que ce n'est pas la meilleure façon d'accomplir cette tâche. Existe-t-il une meilleure façon de tester une clé dans le dictionnaire?


2178
2017-10-21 19:05


origine


Réponses:


in est le moyen prévu pour tester l'existence d'une clé dans un dict.

d = dict()

for i in xrange(100):
    key = i % 10
    if key in d:
        d[key] += 1
    else:
        d[key] = 1

Si vous vouliez un défaut, vous pouvez toujours utiliser dict.get():

d = dict()

for i in xrange(100):
    key = i % 10
    d[key] = d.get(key, 0) + 1

... et si vous voulez toujours vous assurer d'une valeur par défaut pour chaque touche que vous pouvez utiliser defaultdict du collections module, comme ceci:

from collections import defaultdict

d = defaultdict(lambda: 0)

for i in xrange(100):
    d[i % 10] += 1

... mais en général, le in mot-clé est la meilleure façon de le faire.


2232
2017-10-21 19:10



Vous n'avez pas besoin d'appeler les touches:

if 'key1' in dict:
  print "blah"
else:
  print "boo"

Ce sera beaucoup plus rapide car il utilise le hachage du dictionnaire par opposition à faire une recherche linéaire, ce que les touches d'appel feraient.


1093
2017-10-21 19:06



Vous pouvez tester la présence d'une clé dans un dictionnaire en utilisant dans mot-clé:

d = {'a': 1, 'b': 2}
'a' in d # <== evaluates to True
'c' in d # <== evaluates to False

Une utilisation courante pour vérifier l'existence d'une clé dans un dictionnaire avant de la muter est d'initialiser par défaut la valeur (par exemple si vos valeurs sont des listes, par exemple, et que vous voulez vous assurer qu'il y a une liste vide à laquelle vous pouvez ajouter lors de l'insertion de la première valeur pour une clé). Dans des cas comme ceux-ci, vous pouvez trouver le collections.defaultdict() tapez pour être intéressant.

Dans le code plus ancien, vous pouvez également trouver quelques utilisations de has_key(), une méthode obsolète pour vérifier l'existence de clés dans les dictionnaires (il suffit d'utiliser key_name in dict_name, au lieu).


226
2017-10-21 19:16



Vous pouvez raccourcir ceci:

if 'key1' in dict:
    ...

Cependant, c'est au mieux une amélioration cosmétique. Pourquoi croyez-vous que ce n'est pas la meilleure façon?


74
2017-10-21 19:06



Je recommanderais d'utiliser le setdefault méthode à la place. On dirait que ça va faire tout ce que tu veux.

>>> d = {'foo':'bar'}
>>> q = d.setdefault('foo','baz') #Do not override the existing key
>>> print q #The value takes what was originally in the dictionary
bar
>>> print d
{'foo': 'bar'}
>>> r = d.setdefault('baz',18) #baz was never in the dictionary
>>> print r #Now r has the value supplied above
18
>>> print d #The dictionary's been updated
{'foo': 'bar', 'baz': 18}

40
2017-10-21 19:07



Pour plus d'informations sur l'exécution rapide des méthodes proposées de la réponse acceptée (boucles de 10m):

  • 'key' in mydict temps écoulé 1.07 sec
  • mydict.get('key') temps écoulé 1.84 sec
  • mydefaultdict['key'] temps écoulé 1.07 sec

Donc en utilisant in ou defaultdict sont recommandés contre get.


35
2018-05-29 11:06



Le dictionnaire en python a une méthode get ('clé', par défaut). Vous pouvez donc simplement définir une valeur par défaut au cas où il n'y a pas de clé.

values = {...}
myValue = values.get('Key', None)

19
2018-03-01 09:03



Pour vérifier, vous pouvez utiliser has_key() méthode

if dict.has_key('key1'):
   print "it is there"

Si vous voulez une valeur, vous pouvez utiliser get() méthode

a = dict.get('key1', expeced_type)

Si vous voulez un tuple, une liste ou un dictionnaire ou une chaîne comme valeur par défaut comme valeur de retour, utilisez get() méthode

a = dict.get('key1', {}).get('key2', [])

15
2017-09-10 18:37



Utilisation de l'opérateur ternaire:

message = "blah" if 'key1' in dict else "booh"
print(message)

14
2017-08-18 22:58



Qu'en est-il de l'utilisation de EAFP (plus facile de demander pardon que de permission):

try:
   blah = dict["mykey"]
   # key exists in dict
except KeyError:
   # key doesn't exist in dict

Voir les autres postes SO:

Utiliser try vs si en python ou

Vérification de l'existence du membre en Python


14
2018-02-06 16:08