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?
python
dictionary
Mohan Gulati
la source
la source
dict.keys()
crée une liste de clés, selon la documentation docs.python.org/2/library/stdtypes.html#dict.keys mais je serais surpris si ce modèle n'était pas optimisé pour, dans une implémentation sérieuse, à traduire àif 'key1' in dict:
.x in dict.keys()
pour vérifier les clés. Et cela est arrivé parce que la façon habituelle pour parcourir les clés de Java estfor (Type k : dict.keySet())
, cette habitude à l' originefor k in dict.keys()
de se sentir plus naturel quefor k in dict
(ce qui devrait encore être bon en termes de performances?), mais vérifier les clés devientif k in dict.keys()
aussi, ce qui est un problème ...if k in dict_:
teste la présence de k dans les CLÉS de dict_, donc vous n'en avez toujours pas besoindict_.keys()
. (Cela m'a mordu, car il me semble que ses tests pour une valeur dans dict. Mais ce n'est pas le cas.)Réponses:
in
est le moyen prévu pour tester l'existence d'une clé dans un fichierdict
.Si vous vouliez une valeur par défaut, vous pouvez toujours utiliser
dict.get()
:et si vous vouliez toujours garantir une valeur par défaut pour n'importe quelle clé, vous pouvez soit l'utiliser à
dict.setdefault()
plusieurs reprises ou àdefaultdict
partir ducollections
module, comme ceci:mais en général, le
in
mot-clé est le meilleur moyen de le faire.la source
get
si je veux retirer l'élément du dictionnaire de toute façon. Cela n'a aucun sens d'utiliserin
et de retirer l'élément du dictionnaire.in
c'est la meilleure façon de le faire.0
par exemple. J'ai appris ça à la dure: /Vous n'avez pas besoin d'appeler les touches:
Cela sera beaucoup plus rapide car il utilise le hachage du dictionnaire plutôt que de faire une recherche linéaire, ce que feraient les touches d'appel.
la source
if key in d1
pris0.17265701293945312
quelques secondes. L'appel aif key in d1.keys()
pris0.23871088027954102
- c'est la définition classique d'une micro-optimisation. Gagner des0.07884883880615234
secondes n'est pas une amélioration des performances.keys()
vous offre un avantage de calcul de 0,01 seconde. Pour ~ 500 000 clés, le fait de ne pas appelerkeys()
vous donne 0,1 seconde avantage. Pour ~ 5 000 000 touches, ne pas appelerkeys()
est 0,4 seconde plus rapide, mais pour 50 000 000 touches, APPELERkeys()
EST 3 SECONDES PLUS RAPIDE!Vous pouvez tester la présence d'une clé dans un dictionnaire à l'aide du mot clé in :
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 existe une liste vide à laquelle vous pouvez ajouter lors de l'insertion de la première valeur d'une clé). Dans de tels cas, vous pouvez trouver le
collections.defaultdict()
type d'intérêt.Dans un code plus ancien, vous pouvez également trouver certaines utilisations de
has_key()
, une méthode obsolète pour vérifier l'existence de clés dans les dictionnaires (utilisez simplement à lakey_name in dict_name
place).la source
key in dict.keys()
. Essayez de supprimer tout le code à l'exception de cette vérification et voyez quel est votre résultat.Vous pouvez raccourcir ceci:
Cependant, c'est au mieux une amélioration cosmétique. Pourquoi pensez-vous que ce n'est pas la meilleure façon?
la source
Pour plus d'informations sur la vitesse d'exécution des méthodes proposées pour la réponse acceptée (boucles de 10 m):
'key' in mydict
temps écoulé 1,07 secmydict.get('key')
temps écoulé 1,84 secmydefaultdict['key']
temps écoulé 1,07 secPar conséquent, l'utilisation
in
oudefaultdict
est déconseilléeget
.la source
get
1,84 s est <1,07 * 2 ;-PJe recommanderais
setdefault
plutôt d' utiliser la méthode. On dirait qu'il fera tout ce que vous voulez.la source
setdefault
a à voir avec la question du PO?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 aurait pas de clé.
la source
Qu'en est-il de l'utilisation d'EAFP (plus facile de demander pardon que permission):
Voir d'autres postes SO:
Utiliser try vs if en python ou
Vérification de l'existence de membres en Python
la source
En utilisant l'opérateur ternaire:
la source
Les moyens d'obtenir les résultats sont les suivants:
Ce qui est mieux dépend de 3 choses:
En savoir plus: http://paltman.com/try-except-performance-in-python-a-simple-test/
Utilisation de try / block au lieu de 'in' ou 'if':
la source
2to3
, et j'ai vu que la syntaxe sans try est toujours plus rapide que la syntaxe avec try, même dans le cas où la clé est dans le dict.Python 2 uniquement: (et python 2.7 prend
in
déjà en charge )vous pouvez utiliser la méthode has_key ():
la source
.has_key()
a été dépréciée ; vous devez utiliserin
comme indiqué dans les autres réponses.Juste une info pour Chris. B (meilleure réponse):
Fonctionne également; la raison en est que l'appel
int()
renvoie0
ce qui sedefaultdict
passe en arrière-plan (lors de la construction d'un dictionnaire), d'où le nom "Factory Function" dans la documentation.la source
defaultdict(lambda: 0)
au lieu dedefaultdict(int)
parce que je pense que c'est plus clair ce qui se passe; le lecteur n'a pas besoin de savoir0
si vous appelezint()
sans argument. YMMV.Pour avoir une idée de comment faire cela, nous inspectons d'abord les méthodes que nous pouvons appeler dans le dictionnaire. Voici les méthodes:
La méthode brutale pour vérifier si la clé existe déjà peut être la
get()
méthode:Les deux autres méthodes intéressantes
items()
etkeys()
semblent trop de travail. Examinons donc siget()
c'est la bonne méthode pour nous. Nous avons notre dictd
:L'impression montre que la clé que nous n'avons pas sera renvoyée
None
:Nous
pouvonsl' utiliser pour obtenir l'information si la clé est présente ou non. Mais considérez ceci si nous créons un dict avec un seulkey:None
:Diriger cette
get()
méthode n'est pas fiable au cas où certaines valeurs pourraient l'êtreNone
. Cette histoire devrait avoir une fin plus heureuse. Si nous utilisons lein
comparateur:Nous obtenons les bons résultats. Nous pouvons examiner le code d'octet Python:
Cela montre que l'
in
opérateur de comparaison n'est pas seulement plus fiable mais encore plus rapide queget()
.la source
.get()
peut avoir un deuxième argument pour ladefault
valeur, qui pourrait être utilisé pour gérer le problème oùkey:None
. exemple:d.get("key", False)
.get()
est le moyen le plus rapide. Une autre option consiste à affecter dans un bloctry
/except
Le dictionnaire Python a la méthode appelée
__contains__
. Cette méthode retournera True si le dictionnaire a la clé sinon renvoie False.la source
__contains__
directement. La façon correcte de le faire est d'utiliser l'in
opérateur, qui est celuicontainment check
qui invoque la__contains__
fonction.foo = x['foo'] if x.__contains__('foo') else 'bar'
. Des idées sur la façon dont pourrait utiliser l'in
opérateur dans le cadre de cette expression?foo = x['foo'] if 'foo' in x else 'bar'
Partager une autre façon de vérifier si une clé existe à l'aide d'opérateurs booléens.
Cela revient
Explication
D' abord , vous devez savoir qu'en Python,
0
,None
ou des objets avec une longueur nulle à évaluerFalse
. Tout le reste est évaluéTrue
. Les opérations booléennes sont évaluées de gauche à droite et renvoient l'opérande non True ou False.Voyons un exemple:
Puisque
'Some string'
évalue àTrue
, le reste deor
n'est pas évalué et il n'y a pas de division par zéro d'erreur levée.Mais si nous passons la commande
1/0
est évaluée en premier et déclenche une exception:Nous pouvons l'utiliser pour le modèle pour vérifier si une clé existe.
fait la même chose que
Cela renvoie déjà le résultat correct si la clé existe, mais nous voulons qu'elle affiche «boo» lorsqu'elle ne l'est pas. Donc, nous prenons le résultat et
or
avec'boo'
la source
Vous pouvez utiliser la
for
boucle pour parcourir le dictionnaire et obtenir le nom de la clé que vous souhaitez trouver dans le dictionnaire, après cela, vérifiez si elle existe ou n'utilise pas laif
condition:la source
it is exist
etnot exist