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
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
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).
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.
>>> 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
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
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
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.
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.
a.get('a') == 1
=> True
a.get('a') == 2
=> False
si None
est un élément valide:
{'x': None}.get('x', object()) is None