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 :

Question incrémentation valeur dans dictionnaire


Sujet :

Python

  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 198
    Par défaut Question incrémentation valeur dans dictionnaire
    Bonjour,

    débutant en python, je cherche à faire une chose simple (je pense), dans un dictionnaire, créer des clés et incrémenter la valeur de 1.

    J'ai fait ce bout de code simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    dico = {}
    my_new_key = 'cle1'
     
    dico[my_new_key] += 1
    dico[my_new_key] += 1
     
    print(dico)
    J'attends comme résultat
    {'cle1': 2}
    Mais à la place j'ai :
    dico[my_new_key] += 1
    KeyError: 'cle1'
    C'est quoi le truc simple que j'ai raté ?

  2. #2
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 287
    Par défaut
    bonjour

    oui, tu essayes d'incrémenter un élément qui n'existe pas encore, bien sûr on ne peut modifier qu'une chose qui existe

    dico[my_new_key] += 1 est en fait : dico[my_new_key] = dico[my_new_key] + 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    my_new_key = 'cle1'
    dico = {my_new_key: 1}
    dico[my_new_key] += 1
     
     
    dico = {}
    my_new_key = 'cle1'
    dico[my_new_key] = 1    # ici c'est la création d'une clé
    dico[my_new_key] += 1   # ici uniquement modification d'une clé (qui existe)
    print(dico)

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 801
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par caramon _majere Voir le message
    J'attends comme résultat {'cle1': 2}
    Cela signifie donc qu'avant l'incrémentation, tu avais {'cle1': 0}. As-tu écrit quelque part l'instruction qui fait en sorte que ce soit le cas ???

    Citation Envoyé par caramon _majere Voir le message
    C'est quoi le truc simple que j'ai raté ?
    Ladite instruction.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 198
    Par défaut
    Merci pour vos retour.

    J'avais regardé des exemples avant et qui me semblait assez identique à ce qu je faisais en perl.
    Code Perl : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    my %hash;
     
    my $var = 'cle1';
     
    $hash{$var} += 1;
    $hash{$var} += 1;

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 801
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par caramon _majere Voir le message
    J'avais regardé des exemples avant et qui me semblait assez identique à ce qu je faisais en perl.
    En effet, c'est identique.
    Mais peut-être que sous perl (que je ne connais pas) les tableaux associatifs sont initialisés par défaut à 0 (ce qui semble être visible quand on rajoute un print $hash{$var} + "\n"; avant l'incrémentation).

    Donc tu as pris un code perl qui utilisait une caractéristique spécifiques de ce langage ; et tu es parti dans l'hypothèse que sous Python cette caractéristique était aussi présente. Malheureusement (ou heureusement, ça dépend de comment on voit les choses car personnellement je ne vois pas pourquoi il faudrait obligatoirement que Python perde du temps à mettre un truc à 0 si je n'en ai pas l'utilité) ce n'est pas le cas.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 287
    Par défaut
    Tu peux voir la clé d'un dictionnaire comme un index d'un tableau (liste, tuple python)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    tableau = [1,2,3]
    print(tableau[8])  # BEEP
    tableau[8] +=1    # BEEP
    tableau[8] =tableau[8] + 1    # BEEP
    Il me semble plus que logique d'avoir une erreur "clé/index non trouvée" qu'un language qui returne toujours une valeur par défaut; en tout cas, c'est le choix de python
    Et nous avons donc la même logique entre tous conteneurs (dictionnaire, liste, tuple, ...)

    Par contre, avec un dictionnaire, il est possible d'utiliser la méthode get() qui ne retourne pas une erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    dico = {"un": 1, "deux": 2}
    print(dico.get("trois"))
    print(dico.get("trois", "non defini"))   # si existe pas, retourne un "truc" par défaut
    try:
        print(dico["trois"])
    except KeyError:
        print("oops, clé 'trois' n'existe pas")
    ---------

    si je reprends ton exemple, cela pourrait être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    dico = {"un":1, "deux":2}
    my_new_key = 'cle1'
    if not my_new_key in dico:
        dico[my_new_key] = 0
    dico[my_new_key] += 1
    dico[my_new_key] += 1
    print(dico)

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 801
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par papajoker Voir le message
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if not my_new_key in dico:
        dico[my_new_key] = 0
    dico.setdefault(my_new_key, 0)
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 198
    Par défaut
    Merci pour toutes vos réponses.

    Comme l'idée est plus tard, dans une boucle, voir le nombres d'éléments identiques, en faisant un mixte de vos réponses, ca donne ca en version la plus courte.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    dico = {}    
    my_new_key = 'cle1'   
    dico.setdefault(my_new_key, 0)     
    dico[my_new_key] += 1
    dico[my_new_key] += 1
    print(dico)

  9. #9
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 801
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par caramon _majere Voir le message
    en version la plus courte.
    Ce n'est pas la version la plus courte. setdefault est un outil permettant de tester et affecter si la clef n'existe pas (un raccourci de la version de papajoker). Mais si tu gères ton dico depuis le début, alors tu n'as pas besoin de setdefault

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    my_new_key = 'cle1'   
    dico = {my_new_key : 0}
    dico[my_new_key] += 1
    dico[my_new_key] += 1
    print(dico)
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  10. #10
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 287
    Par défaut
    Comme ici, il a parlé de boucle, je vois un cas:
    compter le nombre de fichiers par extention dans un répertoire, donc on ne connais pas la clé au début
    Ici, le test me semble plus pertinant qu'un setdefault (que je ne connaissais pas, donc une bonne chose pour moi hier)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    fichiers = {}
    for fichier in Path('.').glob('*.*'):
       extension = fichier.suffix[1::]
       fichiers[extension] +=1   # oops

  11. #11
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 681
    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 681
    Par défaut
    Citation Envoyé par papajoker Voir le message
    Comme ici, il a parlé de boucle, je vois un cas:
    compter le nombre de fichiers par extention dans un répertoire, donc on ne connais pas la clé au début
    Dans ce cas, il est préférable de sous/classer un dictionnaire pour y ajouter/définir la méthode __missing__ ou mieux utiliser collections.defaultdict.

    Le résultat sera le même mais ça montre qu'on a réfléchi avant de coder pour trouver l'objet ad hoc qui traduira correctement l'intention de départ (et l'initialisation à 0):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    >>> from collections import defaultdict
    >>> dd = defaultdict(int)
    >>> dd['a']
    0
    >>> dd['b'] += 1
    >>> dd
    defaultdict(<class 'int'>, {'a': 0, 'b': 1})
     
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

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

Discussions similaires

  1. aide thread tcp/ip incrémente valeur dans une boucle
    Par PERSONNE_LAMBDA dans le forum Général Python
    Réponses: 15
    Dernier message: 06/03/2019, 14h06
  2. [Python 3.X] question optimisation valeur de dictionnaire cumulée pour les clef inférieurs
    Par flapili dans le forum Général Python
    Réponses: 5
    Dernier message: 27/02/2019, 16h13
  3. [Python 2.X] [Dictionnaire][multivaleur] Incrémenter plusieurs valeurs dans un dictionnaire
    Par jk3531 dans le forum Général Python
    Réponses: 13
    Dernier message: 28/07/2015, 01h08
  4. [Python 2.X] ajout de valeurs dans dictionnaire existant
    Par iguanic dans le forum Général Python
    Réponses: 10
    Dernier message: 20/07/2015, 09h26
  5. Réponses: 2
    Dernier message: 19/05/2008, 10h34

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