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 :

Dictionnaires et ajout de valeur


Sujet :

Python

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2020
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2020
    Messages : 51
    Par défaut Dictionnaires et ajout de valeur
    Bonjour je suis en train d'apprendre à utiliser les dictionnaires. Je suis face à un problème. Dans mon programme je demande à l'utilisateur d'entrer des valeurs dans des listes et celles-ci s'ajoutent aux listes. Ensuite je demande s'il veut associer des éléments des listes ensembles (c'est là qu'arrive le dictionnaire). Le problème c'est que je n'arrive pas à ajouter plusieurs valeurs à ma clef de dictionnaire, ce que je fais actualise seulement ma clef en remplaçant l'ancienne valeur par la nouvelle...

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    import os
     
    prems = []
    second = []
    dic = {}
    boucle = 1
     
    while boucle:
        print("")
        choix = input("Entre des valeurs dans prems Oui ou Non ? ")
     
        if choix == "Oui":
            print("")
            prems.append(input("Entre une valeur dans prems : "))
     
        if choix == "Non":
            print("")
     
        choix2 = input("Entre une valeur dans second Oui ou Non ? ")
     
        if choix2 == "Oui":
            print("")
            second.append(input("Entre une valeur dans second : "))
     
        if choix2 == "Non":
            print("")
     
        associer = input("Associer des valeurs à des clefs Oui ou Non ? ")
     
        if associer == "Oui":
            print("")
            print("prems : ",prems,
                  "",
                  "second : ",second,
                  "")
            print("dictionnaire : ",dic)
            clef = prems.index(input("Entre une clef de dictionnaire venant de prems : "))
            valeur = second.index(input("Entre une valeur dans le dico venant de second : "))
     
     
            dic[clef] = [valeur]
            print("")
            print("dictionnaire : ",dic)
     
        elif associer == "Non":
            continue
     
    os.system("stop")
    je précise que je connais defaultdict mais que je ne peux pas l'utiliser dans ce cas pratique car on ne doit pas faire des tuples avec les deux listes. Chaque liste est indépendante, et chaque valeurs de second doit pouvoir s'ajouter librement à une clef de prems si l'utilisateur le souhaite.

    Merci pour votre aide !

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 683
    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 683
    Par défaut
    Salut,


    Chaque liste est indépendante, et chaque valeurs de second doit pouvoir s'ajouter librement à une clef de prems si l'utilisateur le souhaite.
    On ne peut rien ajouter à la clef (sinon c'est une autre clef) mais à l'objet associé a cette clef. Et si c'est une liste, "append" à la liste existante sera une solution.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2020
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2020
    Messages : 51
    Par défaut
    d'accord je vois parce que comme je défini un dictionnaire vide au début, moi ce que je voulais c'était pouvoir sortir une valeur de liste pour l'ajouter aux valeurs associées à l'objet clef. En gros avoir un résultat comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dictionnaire = {}
    liste = [1,2,3]
    dictionnaire : {ma_clef : [valeur de liste, valeur de liste...]}
    du coup le système que je veux faire ne marche pas avec un ajout d'une valeur par l'utilisateur si j'ai bien compris ? Du coup tout ne se passe que par la gestion de liste ?

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 683
    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 683
    Par défaut
    Citation Envoyé par Goulthard Voir le message
    du coup le système que je veux faire ne marche pas avec un ajout d'une valeur par l'utilisateur si j'ai bien compris ?
    On peut ajouter un objet (choisi par l'utilisateur) à la liste associée à une des clefs...

    Citation Envoyé par Goulthard Voir le message
    Du coup tout ne se passe que par la gestion de liste ?
    Imaginez une variable V associée à la liste [ 'toto' ]:
    si je veux y ajouter 'tutu':
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> V = V + ['tutu']
    >>> V
    ['toto', 'tutu']
    >>>
    Et si je remplace V par dico[k], ça marche pareil.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 811
    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 811
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Goulthard Voir le message
    d'accord je vois parce que comme je défini un dictionnaire vide au début, moi ce que je voulais c'était pouvoir sortir une valeur de liste pour l'ajouter aux valeurs associées à l'objet clef. En gros avoir un résultat comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dictionnaire = {}
    liste = [1,2,3]
    dictionnaire : {ma_clef : [valeur de liste, valeur de liste...]}
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    dictionnaire={}
    dictionnaire[ma_clef]=[]
    dictionnaire[ma_clef].append(1)
    dictionnaire[ma_clef].append(2)
    dictionnaire[ma_clef].append(3)
    print(dictionnaire[ma_clef])

    Citation Envoyé par Goulthard Voir le message
    du coup le système que je veux faire ne marche pas avec un ajout d'une valeur par l'utilisateur si j'ai bien compris ? Du coup tout ne se passe que par la gestion de liste ?
    Une clef de dictionnaire c'est comme une variable de base. Si une variable contient un élément immuable (int, str, float, tuple) alors cet élément ne peut pas "s'étendre". Il peut juste être remplacé par un autre.
    Si maintenant cette variable contient un élément mutable (liste, ensemble, dictionnaire) alors cet élément peut s'étendre en utilisant une méthode dédiée.
    Et cette règle s'applique à tout ce qui peut "agréger des éléments ensembles" (un tuple, une liste, un ensemble, un dictionnaire). Par exemple un tuple c'est n éléments ensembles, chaque élément pouvant donc lui-même être mutable ou immuable.
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> xxx=(list(), "toto")
    >>> xxx[0].append(1)
    >>> xxx[0].append(2)
    >>> xxx[0].append(3)
    >>> xxx
    ([1, 2, 3], "toto")
    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
    Invité
    Invité(e)
    Par défaut
    Salut !

    J'ai compris 1/4 de ta demande, du coup au pif :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    >>> dico = {}
     
    >>> dico.setdefault('k',[]).append(5)
    >>> dico
    {'k': [5]}
     
    >>> dico.setdefault('k',[]).append(12)
    >>> dico
    {'k': [5, 12]}
    Au pif n° 2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    >>> def toto(key):
    	dico = dict()
    	for w in ('premier', 'second'):
    		dico.setdefault(key,[]).append(input(f'Saisir un {w} mot :\n'))
    	return dico
     
    >>> toto("Tete")
    Saisir un premier mot :
    Titi
    Saisir un second mot :
    Tutu
    {'Tete': ['Titi', 'Tutu']}
    Si ça peut aider, j'en serais ravi !

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2020
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2020
    Messages : 51
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Bonjour


    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    dictionnaire={}
    dictionnaire[ma_clef]=[]
    dictionnaire[ma_clef].append(1)
    dictionnaire[ma_clef].append(2)
    dictionnaire[ma_clef].append(3)
    print(dictionnaire[ma_clef])


    Une clef de dictionnaire c'est comme une variable de base. Si une variable contient un élément immuable (int, str, float, tuple) alors cet élément ne peut pas "s'étendre". Il peut juste être remplacé par un autre.
    Si maintenant cette variable contient un élément mutable (liste, ensemble, dictionnaire) alors cet élément peut s'étendre en utilisant une méthode dédiée.
    Et cette règle s'applique à tout ce qui peut "agréger des éléments ensembles" (un tuple, une liste, un ensemble, un dictionnaire). Par exemple un tuple c'est n éléments ensembles, chaque élément pouvant donc lui-même être mutable ou immuable.
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> xxx=(list(), "toto")
    >>> xxx[0].append(1)
    >>> xxx[0].append(2)
    >>> xxx[0].append(3)
    >>> xxx
    ([1, 2, 3], "toto")
    Merci beaucoup le code marche mais j'ai un soucis quand j'essaie de me l'approprier...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    dictionnaire = {}
    liste = [1,2,3]
    ma_clef = "a"
     
    dictionnaire={}
    dictionnaire[ma_clef]=[]
    dictionnaire[ma_clef].append(1)
    dictionnaire[ma_clef].append(2)
    dictionnaire[ma_clef].append(3)
    print(dictionnaire)
    comme ça votre code marche (j'ai retiré le [ma_clef] du print pour voir l'ensemble du dictionnaire) mais maintenant si je créer une liste ma_clef = [] à la place de ma_clef = "a" et que j'ajoute une fonction append pour fournir cette liste il me renvoi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TypeError: unhashable type: 'list'
    j'ai cherché des infos sur cette erreur mais je ne suis pas sûr d'avoir tout compris

  8. #8
    Membre Expert
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan à 3 francs six sous
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2018
    Messages : 914
    Billets dans le blog
    7
    Par défaut
    Bonjour,
    Citation Envoyé par Goulthard Voir le message
    si je créer une liste ma_clef = [] à la place de ma_clef = "a" et que j'ajoute une fonction append pour fournir cette liste il me renvoi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TypeError: unhashable type: 'list'
    Une clef ne peut pas être mutable (contrairement à la valeur qui lui est associée). Elle ne peut donc pas être une liste...

  9. #9
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 683
    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 683
    Par défaut
    Citation Envoyé par Goulthard Voir le message
    j'ai cherché des infos sur cette erreur mais je ne suis pas sûr d'avoir tout compris
    Un dictionnaire réalise un tableau de hachage... et placer la paire clef,valeur dans la structure associée à cette table, se fera en calculant le "hash" de la clef.

    Si la clef est modifiable (comme une liste), modifier la clef modifiera ce hash et forcerait le déplacement de la paire clef, valeur à un autre endroit. Techniquement, ce n'est pas inenvisageable, mais dans la pratique, ça ne correspond pas à l'usage d'un dictionnaire.

    Reprenez l'exemple:
    j'ai crée le nom V associé à ce que je veux... et plus tard, je sais quoi faire pour récupérer l'objet associé (il suffit d'écrire V). Si un petit malin s'amuse à changer V en W, çà foutra juste la grouille si on ne remplace pas tous les V par W (ou si on ne passe pas par un alias W = V, les deux permettant d'arriver au même objet).

    Et les variables Python (que vous utilisez depuis quelque temps) sont un dictionnaire (globals()) qui associe un 'V' à une liste contenant 'toto'.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  10. #10
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 811
    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 811
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Goulthard Voir le message
    Merci beaucoup le code marche mais j'ai un soucis quand j'essaie de me l'approprier...
    Oui c'est vrai que quand j'ai écrit "Une clef de dictionnaire c'est comme une variable de base"... je me suis mal exprimé.
    Ce que je voulais dire, c'est que quand on écrit dictionnaire[clef]=..., tout comme on écrit var=..., on peut y mettre n'importe quoi, d'un simple nombre jusqu'à un truc complexe comme une liste ou même un autre dictionnaire.

    Toutefois la clef, elle, a une contrainte qui est qu'elle ne doit pas être un truc mutable. On peut écrire dictionnaire[1]=... (la clef est un int donc immuable), dictionnaire["toto"]=... (la clef est une string donc immuable), dictionnaire[(1, 2, 3)]=... (la clef est un tuple contenant des int, donc immuable), mais pas dictionnaire[[1, 2]]=... car la clef est une liste donc mutable. Ni dictionnaire[(1, 2, [])]=... (le tuple qui sert de clef contient une liste, donc devient mutable).

    Parce que derrière le dictionnaire, il y a un mécanisme un peu complexe qui convertit la clef en référence numérique (au bout du bout il n'y a que du nombre) et cette référence ne doit évidemment pas changer au gré du vent...
    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]

Discussions similaires

  1. Réponses: 4
    Dernier message: 15/12/2021, 21h51
  2. ajouter une valeur dans un tableau se trouvant dans un dictionnaire
    Par alaninho dans le forum Général Python
    Réponses: 2
    Dernier message: 05/10/2015, 13h24
  3. [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
  4. Ajouter une valeur à un dictionnaire
    Par niepoc dans le forum Général Python
    Réponses: 10
    Dernier message: 21/05/2010, 20h41
  5. [Tableaux]Ajouter des valeurs dans un tableau
    Par Antoine1183 dans le forum Collection et Stream
    Réponses: 13
    Dernier message: 03/04/2005, 13h41

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