IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

vérifier une clé dans un dictionnaire


Sujet :

Python

  1. #1
    Membre émérite
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2003
    Messages
    910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 910
    Par défaut vérifier une clé dans un dictionnaire
    Bonjour;

    Comment faire pour vérifier si une clé existe dans un dictionnaire.
    J'ai tenté ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if dict['key_value'] != None:
    Mais j'ai quand-même le message d'erreur "Key Error"

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 159
    Par défaut
    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!

  3. #3
    Membre émérite
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2003
    Messages
    910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 910
    Par défaut
    Merci

  4. #4
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 120
    Par défaut
    La méthode has_key(key) du dico est typiquement fait pour ça.

  5. #5
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    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,)

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 159
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    La méthode has_key(key) du dico est typiquement fait pour ça.
    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.

  7. #7
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 120
    Par défaut
    La doc n'encourage plus vraiment l'usage de cette méthode
    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.

    Et en comparaison, au niveau performance, ta méthode est plus efficace.


  8. #8
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    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
    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
    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
    >>> 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
    Etc...

    Le cache misère qu'est except tout seul rend le debug quasi impossible donc autant s'en passer: except doit être explicite.

  9. #9
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    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.

  10. #10
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 776
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 776
    Par défaut
    Salut,

    Je préfère laisser aux exceptions leur statut d'exception, genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    assert key in d, 'fatal: key=%s not set' % key
    Maintenant, la construction initiale: "if d[key] != None" pourrait être équivalente à if "d.get(key, None) is None".
    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.

    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 ...
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  11. #11
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    except Exception, e:
        print e
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    except Exception as e:
        print(e)
    (as >= Python 2.6) l'est largement pour être acceptable.

    @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:

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Vérifier une requete dans une vue
    Par codesig dans le forum Langage
    Réponses: 6
    Dernier message: 14/08/2007, 15h31
  2. comment modifier une liste dans un dictionnaire?
    Par Mydriaze dans le forum Général Python
    Réponses: 1
    Dernier message: 06/08/2007, 19h57
  3. Une variable dans un dictionnaire, et faire recherche
    Par ploop dans le forum Général Python
    Réponses: 4
    Dernier message: 30/06/2007, 19h01
  4. [Formulaire]vérifier une saisie dans une zone de liste
    Par ludovicparis dans le forum IHM
    Réponses: 6
    Dernier message: 02/04/2007, 14h51
  5. [MySQL] Vérifier une URL dans la validation d'un formulaire
    Par groupejtt dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 30/11/2006, 11h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo