Bonjour;
Comment faire pour vérifier si une clé existe dans un dictionnaire.
J'ai tenté ça :
Mais j'ai quand-même le message d'erreur "Key Error"
Code : Sélectionner tout - Visualiser dans une fenêtre à part if dict['key_value'] != None:
Bonjour;
Comment faire pour vérifier si une clé existe dans un dictionnaire.
J'ai tenté ça :
Mais j'ai quand-même le message d'erreur "Key Error"
Code : Sélectionner tout - Visualiser dans une fenêtre à part if dict['key_value'] != None:
Hello,
comme ça
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 Python 2.6.5 (r265:79063, Apr 16 2010, 13:09:56) [GCC 4.4.3] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> dic = {'a': 1, 'b':2} >>> 'a' in dic True >>> 'c' in dic False >>> if 'a' in dict: ... print 'yeah!' ... yeah!
La méthode has_key(key) du dico est typiquement fait pour ça.
Bonjour,
On peut aussi générer une exception:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 d = {'a':1, 'b':2, 'c':3} cle = 'x' try: print d[cle] except: print u"raté: la clé %s n'existe pas!" % (cle,)
La doc n'encourage plus vraiment l'usage de cette méthode
http://docs.python.org/library/stdty...l#dict.has_key
has_key() is deprecated in favor of key in d.
En effet, merci de m'en faire rendre compte, j'avais même pas capté. Dans la version 3 elle est même supprimée à ce que j'ai pu lire.La doc n'encourage plus vraiment l'usage de cette méthode
Et en comparaison, au niveau performance, ta méthode est plus efficace.
![]()
Ben de toute façon il est recommandable d'utiliser in lorsque c'est possible.
Par contre je réagit au code de tyrtamos :
except KeyError: si tu le souhaite mais jamais except tout seul.
Écrasement dans le namespace
Ou encore erreur de variable/problème de visibilité
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 >>> d = {'a':1, 'b':2, 'c':3} >>> d = '' >>> cle = 'x' >>> try: ... print d[cle] File "<stdin>", line 2 print d[cle] ^ SyntaxError: invalid syntax >>> try: ... print(d[cle]) ... except: ... print("raté: la clé %s n'existe pas!" % (cle,)) ... raté: la clé x n'existe pas! >>> print(d[cle]) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: string indices must be integers
Etc...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 >>> try: ... print(d1[cle]) ... except: ... print("raté: la clé %s n'existe pas!" % (cle,)) ... raté: la clé x n'existe pas! >>> print(d1[cle]) Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'd1' is not defined
Le cache misère qu'est except tout seul rend le debug quasi impossible donc autant s'en passer: except doit être explicite.
Bonjour PauseKawa,
Je sais, je sais...
Mais je n'y accorde pas la même importance que toi. Je mets d'ailleurs souvent "Exception". Il y a en fait une grande raison: au cas ou il se produirait une erreur à laquelle je n'ai pas pensé, je ne veux pas que le programme se plante, car les dégâts pourraient être beaucoup plus graves qu'une difficulté de debugging. Par exemple dans les cas que tu cites, si la clé était calculée par une expression, il pourrait aussi y avoir un problème d'encodage ou de division par zéro...
Alors je mets un except "attrape tout", et j'exploite systématiquement le message d'erreur qui est assez complet, et qui donne, lui, l'erreur qui a déclenché l'exception. Pendant la phase de mise au point, j'aurais ainsi détecté les erreurs que tu cites.
Mais je n'entraine personne dans cette pratique pas très fine, mais assez efficace...
Il y a par contre des cas ou il est important de citer les exceptions exactes, c'est quand on doit réagir différemment selon l'exception: on place alors plusieurs 'except' successifs.
Salut,
Je préfère laisser aux exceptions leur statut d'exception, genre:
Maintenant, la construction initiale: "if d[key] != None" pourrait être équivalente à if "d.get(key, None) is None".
Code : Sélectionner tout - Visualiser dans une fenêtre à part assert key in d, 'fatal: key=%s not set' % key
Dans ce cas, peut importe le résultat de "key in d". Définie ou pas, on récupère toujours une valeur par défaut.
Pas toujours souhaitable mais bon à (se) rappeler s'il faut toujours exécuter le block liée à la condition.
- W
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 if key in d: # block exécuté sous condition que... value = d[key] if value == ... elif ... # toujours exécuté value = d.get(key, None) if value == ... elif ...
C'était juste une remarque de 'bonne pratique' pour éviter l'usage d'un except sans que celui ci ne soit explicite sur l'erreur (erreur fréquente lorsque l'on commence la programmation avec Python).
Le fait d'utiliser
ou
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 except Exception, e: print e
(as >= Python 2.6) l'est largement pour être acceptable.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 except Exception as e: print(e)
@wiztricks:
+1000
Avec les Pythoneries compréhensions, entre autre, ont en est a faire du 'code' 'plus courts' en oubliant les blocks de code exécutés.
if/in est fabuleux de simplicité ET d'efficacité.
N’ayons pas 'honte' a faire du code simple et efficace.
Edit:
Ne pas oublier and qui n'est exécuter que si la première condition est False (Voir and/or: Plus rapide en condition difficile. Du même niveau que in).
if 'c' in dic and dic['c'] != None:
Partager