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:if dict['key_value'] != None:
Version imprimable
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:if dict['key_value'] != None:
Hello,
comme ça
Code:
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!
Merci
La méthode has_key(key) du dico est typiquement fait pour ça.
Bonjour,
On peut aussi générer une exception:
Code:
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
Citation:
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.Citation:
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:
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:
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: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.
- WCode:
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
ouCode:
1
2 except Exception, e: print e
(as >= Python 2.6) l'est largement pour être acceptable.Code:
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: