vide - récupérer clé dictionnaire python




Vérifier si une clé donnée existe déjà dans un dictionnaire (13)

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 un meilleur moyen de tester une clé dans le dictionnaire?


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

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

Eh bien .. Vous savez sûrement que rechercher l’existence d’un élément dans une liste ou dans des données signifie tout parcourir (au moins pour une liste non ordonnée, par exemple, dict.keys). Ainsi, en utilisant Exception et Erreurs qui surviennent normalement, nous pouvons éviter cette complexité ...

d={1:'a',2:'b'}
try:
    needed=d[3]
    print(needed)
except:
    print("Key doesnt exist")

Je recommanderais d'utiliser la méthode setdefault place. On dirait que cela fera tout ce que vous voulez.

>>> 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}

Juste un ajout à Chris. B (meilleure réponse):

d = defaultdict(int)

Fonctionne aussi bien; la raison en est que l'appel de int() renvoie 0 ce que fait defaultdict coulisse (lors de la construction d'un dictionnaire), d'où le nom "Factory Function" dans la documentation.


Le plus simple est de savoir quelle clé (nom de clé) doit rechercher:

# suppose your dictionary is
my_dict = {'foo': 1, 'bar': 2}
# check if a key is there
if 'key' in my_dict.keys():   # it will evaluates to true if that key is present otherwise false.
    # do something

ou vous pouvez aussi simplement faire comme:

if 'key' in my_dict:   # it will evaluates to true if that key is present otherwise false.
    # do something

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

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

Par conséquent, l'utilisation de in ou defaultdict est recommandée contre get .


Pourquoi ne pas utiliser simplement la méthode has_key ().

a = {}
a.has_key('b') => #False

a['b'] = 8
a.has_key('b') => #True


Vous n'êtes pas obligé d'appeler des clés:

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

Ce sera beaucoup faster car il utilise le hachage du dictionnaire plutôt que de faire une recherche linéaire, ce que feraient les touches d'appel.


Vous pouvez raccourcir ceci:

if 'key1' in dict:
    ...

Cependant, il s’agit au mieux d’une amélioration esthétique. Pourquoi pensez-vous que ce n'est pas la meilleure façon?


in est la manière prévue de 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 voulez une valeur par 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 assurer une valeur par défaut pour toute clé, vous pouvez utiliser defaultdict partir du module collections , 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 mot clé in est le meilleur moyen de le faire.


print dict.get('key1', 'blah')

N'imprimera pas boo pour les valeurs du dict, mais accomplit l'objectif en imprimant la valeur de key1 pour confirmer son existence.


Vous pouvez utiliser la méthode has_key ():

if dict.has_key('xyz')==1:
    #update the value for the key
else:
    pass

Ou la méthode dict.get pour définir une valeur par défaut si non trouvée:

mydict = {"a": 5}

print mydict["a"]            #prints 5
print mydict["b"]            #Throws KeyError: 'b'

print mydict.get("a", 0)     #prints 5
print mydict.get("b", 0)     #prints 0




dictionary