web-dev-qa-db-fra.com

Comment vérifier si une paire clé-valeur est présente dans un dictionnaire?

Existe-t-il un moyen intelligent Pythonic de vérifier s’il existe un élément (clé, valeur) dans un dict?

a={'a':1,'b':2,'c':3}
b={'a':1}
c={'a':2}

b in a:
--> True
c in a:
--> False
10
Peter

Utilisez la propriété de court-circuitage de and. De cette façon, si la main gauche est fausse, vous n'obtiendrez pas une KeyError lors de la vérification de la valeur.

>>> a={'a':1,'b':2,'c':3}
>>> key,value = 'c',3                # Key and value present
>>> key in a and value == a[key]
True
>>> key,value = 'b',3                # value absent
>>> key in a and value == a[key]
False
>>> key,value = 'z',3                # Key absent
>>> key in a and value == a[key]
False
13
Bhargav Rao

Vous avez marqué cette 2.7, par opposition à 2.x, afin de pouvoir vérifier si le Tuple est dans la variable viewitems du dict:

(key, value) in d.viewitems()

Sous le capot, cela correspond essentiellement à key in d and d[key] == value.

En Python 3, viewitems est juste items, mais n'utilisez pas items en Python 2! Cela va construire une liste et faire une recherche linéaire en prenant O(n) temps et espace pour faire ce qui devrait être une vérification rapide O(1).

7
user2357112

Conversion de mon commentaire en réponse: 

Utilisez la méthode dict.get qui est déjà fournie en tant que méthode intégrée (et je suppose que c'est la plupart du temps Pythonic)

>>> dict = {'Name': 'Anakin', 'Age': 27}
>>> dict.get('Age')
27
>>> dict.get('Gender', 'None')
'None'
>>>

Selon les docs -

get (clé, valeur par défaut) - Renvoie la valeur de key si key se trouve dans le dictionnaire, sinon default . Si default n'est pas spécifié, la valeur par défaut est None, de sorte que cette méthode ne pose jamais une erreur KeyError.

3
letsc
>>> a = {'a': 1, 'b': 2, 'c': 3}
>>> b = {'a': 1}
>>> c = {'a': 2}

Tout d'abord, voici une méthode qui fonctionne pour Python2 et Python3

>>> all(k in a and a[k] == b[k] for k in b)
True
>>> all(k in a and a[k] == c[k] for k in c)
False

En Python3, vous pouvez également utiliser

>>> b.items() <= a.items()
True
>>> c.items() <= a.items()
False

Pour Python2, l'équivalent est

>>> b.viewitems() <= a.viewitems()
True
>>> c.viewitems() <= a.viewitems()
False
3
John La Rooy

Vous pouvez comparer un tuple de la clé, valeur, à la fonction .items() du dictionnaire.

test = {'a': 1, 'b': 2}
print(('a', 1) in test.items())
>>> True
1
Morgan Thrapp

Pour Python 3.x , Utilisezif key in dict

Voir l'exemple de code

#!/usr/bin/python
a={'a':1,'b':2,'c':3}
b={'a':1}
c={'a':2}
mylist = [a, b, c]
for obj in mylist:
    if 'b' in obj:
        print(obj['b'])


Output: 2
0
IRSHAD

Utiliser .get est généralement le meilleur moyen de vérifier si une paire clé-valeur existe. 

if my_dict.get('some_key'):
  # Do something

Il y a une mise en garde, si la clé existe mais est faussement, alors le test échouera, ce qui peut ne pas être ce que vous voulez. Gardez à l'esprit que c'est rarement le cas. Maintenant, l'inverse est un problème plus fréquent. C'est utiliser in pour tester la présence d'une clé. J'ai souvent rencontré ce problème lors de la lecture de fichiers csv.

Exemple

# csv looks something like this:
a,b
1,1
1,

# now the code
import csv
with open('path/to/file', 'r') as fh:
  reader = csv.DictReader(fh) # reader is basically a list of dicts
  for row_d in reader:
    if 'b' in row_d:
      # On the second iteration of this loop, b maps to the empty string but
      # passes this condition statement, most of the time you won't want 
      # this. Using .get would be better for most things here. 
0
Dan

Utiliser get:

# this doesn't work if `None` is a possible value
# but you can use a different sentinal value in that case
a.get('a') == 1

Utilisation de try/except:

# more verbose than using `get`, but more foolproof also
a = {'a':1,'b':2,'c':3}
try:
    has_item = a['a'] == 1
except KeyError:
    has_item = False

print(has_item)

D'autres réponses suggérant items en Python3 et viewitems en Python 2.7 sont plus lisibles et plus idiomatiques, mais les suggestions de cette réponse fonctionneront dans les deux versions de Python sans code de compatibilité et fonctionneront toujours dans le même temps. Choisissez votre poison.

0
eestrada
   a.get('a') == 1
=> True
   a.get('a') == 2
=> False

si None est un élément valide:

{'x': None}.get('x', object()) is None
0
GingerPlusPlus