354 votes

Comment vérifier si une valeur existe dans un dictionnaire (python)

J'ai le dictionnaire suivant en python :

d = {'1': 'one', '3': 'three', '2': 'two', '5': 'five', '4': 'four'}

J'ai besoin d'un moyen de savoir si une valeur telle que "un" ou "deux" existe dans ce dictionnaire.

Par exemple, si je voulais savoir si l'indice "1" existe, il me suffirait de taper :

"1" in d

Et python me dirait alors si c'est vrai ou faux, mais j'ai besoin de faire exactement la même chose, sauf pour savoir si une valeur existe.

495voto

mac Points 16282
>>> d = {'1': 'one', '3': 'three', '2': 'two', '5': 'five', '4': 'four'}
>>> 'one' in d.values()
True

Par curiosité, un peu de temps de comparaison :

>>> T(lambda : 'one' in d.itervalues()).repeat()
[0.28107285499572754, 0.29107213020324707, 0.27941107749938965]
>>> T(lambda : 'one' in d.values()).repeat()
[0.38303399085998535, 0.37257885932922363, 0.37096405029296875]
>>> T(lambda : 'one' in d.viewvalues()).repeat()
[0.32004380226135254, 0.31716084480285645, 0.3171098232269287]

EDITAR: Et au cas où vous vous demanderiez pourquoi... la raison est que chacun des éléments ci-dessus renvoie un type d'objet différent, qui peut ou non être bien adapté aux opérations de recherche :

>>> type(d.viewvalues())
<type 'dict_values'>
>>> type(d.values())
<type 'list'>
>>> type(d.itervalues())
<type 'dictionary-valueiterator'>

EDIT2 : Comme demandé dans les commentaires...

>>> T(lambda : 'four' in d.itervalues()).repeat()
[0.41178202629089355, 0.3959040641784668, 0.3970959186553955]
>>> T(lambda : 'four' in d.values()).repeat()
[0.4631338119506836, 0.43541407585144043, 0.4359898567199707]
>>> T(lambda : 'four' in d.viewvalues()).repeat()
[0.43414998054504395, 0.4213531017303467, 0.41684913635253906]

0 votes

Je n'ai pas de python sous la main, pouvez-vous refaire les tests avec 'quatre' au lieu de 'un' ?

2 votes

Ce n'était pas nécessaire après tout, à moins d'utiliser un dictateur plus gros. Je suppose que l'overhead dans values() est causé par la copie de la liste de valeurs et dans viewvalues() par le maintien en vie de la vue.

2 votes

Compte tenu de la petite taille de d les temps sont effectivement sans signification. Dans Python 3, dict.values() est une vue de dictionnaire, par défaut, et dict.itervalues() y dict.viewvalues() sont partis. Vous pourriez refaire ce test (avec un dictionnaire plus grand) et utiliser list(d.values()) pour obtenir le comportement de Python 2, et iter(d.values()) pour obtenir le dict.itervalues() mais comme ces deux versions nécessitent une recherche et un appel globaux, elles seront absolument plus lentes. Les deux font un travail supplémentaire qui n'est pas nécessaire.

53voto

Sven Marnach Points 133943

En Python 3, vous pouvez utiliser

"one" in d.values()

pour vérifier si "one" fait partie des valeurs de votre dictionnaire.

En Python 2, il est plus efficace d'utiliser

"one" in d.itervalues()

à la place.

Notez que cela déclenche un balayage linéaire à travers les valeurs du dictionnaire, se court-circuitant dès qu'il est trouvé, donc c'est beaucoup moins efficace que de vérifier si une clé est présente.

4 votes

Je sais que c'est une vraiment C'est une vieille réponse, mais je voulais juste noter que dans Python 3, il est values() et non itervalues() . Je suis passé en mode idiot pendant un moment et j'ai essayé d'obtenir itervalues() travaillant en Python 3, avant de réaliser que je suis un idiot.

1 votes

@digitalformula Merci, j'ai mis à jour la réponse pour être plus utile.

3 votes

@digitalformula c'est exactement le piège dans lequel je suis tombé aussi, merci beaucoup.

34voto

Shameem Points 1025

Le dictionnaire Python a get(clé) fonction

>>> d.get(key)

Par exemple,

>>> d = {'1': 'one', '3': 'three', '2': 'two', '5': 'five', '4': 'four'}
>>> d.get('3')
'three'
>>> d.get('10')
None

Si votre clé n'existe pas, elle renvoie la réponse suivante None valeur.

foo = d[key] # raise error if key doesn't exist
foo = d.get(key) # return None if key doesn't exist

Contenu pertinent pour les versions inférieures à 3.0 et supérieures à 5.0.

11voto

soulcheck Points 17680

Utilisez les vues du dictionnaire :

if x in d.viewvalues():
    dosomething()..

5voto

Différents types pour vérifier les valeurs existantes

d = {"key1":"value1", "key2":"value2"}
"value10" in d.values() 
>> False

Liste de valeurs "What if

test = {'key1': ['value4', 'value5', 'value6'], 'key2': ['value9'], 'key3': ['value6']}
"value4" in [x for v in test.values() for x in v]
>>True

Et si une liste de valeurs avec des valeurs de type chaîne de caractères

test = {'key1': ['value4', 'value5', 'value6'], 'key2': ['value9'], 'key3': ['value6'], 'key5':'value10'}
values = test.values()
"value10" in [x for v in test.values() for x in v] or 'value10' in values
>>True

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X