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 :

Problème de boucle for (indentation)


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2021
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2021
    Messages : 2
    Par défaut Problème de boucle for (indentation)
    Bonjour,
    Je voudrais créer une liste de dictionnaire de la forme:
    compositeurs = [ f'comp' :'Mozart', 'a naiss' :1756, 'a mort' :1791g,f'comp' :'Beethoven', "a naiss' :1770, ...g, f'Haendel' : ... g, ... ]
    Je pense que j'ai un problème de boucle for au niveau de la méthode append (ça traite seulement le dernier enregistrement fait par l'utilisateur).
    Je vous remercie d'avance pour votre aide.
    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
    print("Bienvenu!!")
    try:
        nc = int(input("Combien de compositeurs voulez vous saisir?: "))
        compositeurs = {}
        dic_nom_comp = {}
        dic_a_naiss = {}
        dic_a_mort = {}
        liste_comp = []
        for i in range(nc):
            lib_c = 'comp'
            nom_comp = input("Donner le nom du compositeur: ")
            dic_nom_comp[lib_c] = nom_comp
            lib_an = 'a_naiss'
            a_naiss = int(input("Donner l'année de naissance du compositeur: "))
            dic_a_naiss[lib_an] = a_naiss
            lib_am = 'a_mort'
            a_mort = int(input("Donner l'année de décès du compositeur: "))
            dic_a_mort[lib_am] = a_mort
            for j in (dic_nom_comp, dic_a_naiss, dic_a_mort):
                compositeurs.update(j)
            liste_comp.append(compositeurs)
        print(liste_comp)
    except ValueError:
        print("Veuillez vérifier votre saisie!")

  2. #2
    Membre Expert
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    923
    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 : 923
    Billets dans le blog
    8
    Par défaut
    Bonjour,
    Il te faut travailler sur la copie de ton dictionnaire pour éviter les effets de bords rencontrés.
    Tu peux pour cela utiliser le module copy.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    liste_comp.append(copy.deepcopy(compositeurs))

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    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 833
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Hominidé Voir le message
    Tu peux pour cela utiliser le module copy
    Un peu lourd peut-être... => liste_comp.append(dict(compositeurs))

    Citation Envoyé par spoiledog Voir le message
    Je pense que j'ai un problème de boucle for au niveau de la méthode append (ça traite seulement le dernier enregistrement fait par l'utilisateur).
    C'est un souci lié à la façon qu'à Python de copier un objet. Pour aller plus vite, il ne copie que la référence (si on était en C on parlerait d'adresse). Et donc quand tu ajoutes le dictionnaire "compositeur" tu n'ajoutes que sa référence à la liste (tu le verras mieux si tu rajoutes cette instruction print(tuple(id(x) for x in liste_comp)))

    C'est un souci équivalent à ceci
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> a=[1, 2, 3]
    >>> b=a
    >>> a.append("toto")
    >>> print(a)
    [1, 2, 3, 'toto']
    >>> print(b)
    [1, 2, 3, 'toto']

    Généralement cette façon de copier les objets suffit à la majorité des cas. Mais dans les rares moments où cela pose souci, alors pour l'éviter, comme dit Hominidé il te faut copier non pas le dictionnaire d'origine mais un double d'où le dict(compositeur) qui crée à la volée un second dictionnaire basé sur le premier.

    Si on reprend l'exemple précédent, cela donnerait
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> a=[1, 2, 3]
    >>> b=list(a)
    >>> a.append("toto")
    >>> print(a)
    [1, 2, 3, 'toto']
    >>> print(b)
    [1, 2, 3]

    Après cette façon de faire ne fonctionne que pour la copie simple (si tu as un dictionnaire qui contient lui-même des objets, cela ne dupliquera pas les objets internes mais seulement leurs références). Et donc pour les super rares cas (perso cela ne m'est arrivé qu'une seule fois) où tu dois copier un objet "en profondeur" tu as le module "copy" et sa fonction deepcopy() montrée par Hominidé qui fait le job.

    Sinon concernant ton code, avec la position de ton try...except, une seule erreur de saisie annule tout et oblige à tout faire re-saisir. Ok pourquoi pas mais ça va vite gonfler les utilisateurs...
    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
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Salut,

    Une autre façon de voir la chose est que si à chaque itération on ajoute l'objet compositeurs à la liste, cela suppose de créer aussi un nouvel objet à chaque itération:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        ...
        for i in range(nc):
            compositeurs = {}
            lib_c = 'comp'
            ...
    Et la question qui pourrait être posée est côté intérêt des dictionnaires intermédiaires dans cette opération: si à la fin de la saisie on recopie tout dans compositeurs, autant mettre à jour ce dictionnaire là dès le départ.

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

  5. #5
    Invité
    Invité(e)
    Par défaut
    Salut !

    @spoiledog
    Pourquoi ne pas faire un truc dans ce genre ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    print("Bienvenu!!")
    try:
        liste_comp = []
        for i in range(int(input("Combien de compositeurs voulez vous saisir?: "))):
            nom_comp = input("Donner le nom du compositeur: ")
            a_naiss = int(input("Donner l'année de naissance du compositeur: "))
            a_mort = int(input("Donner l'année de décès du compositeur: "))
            liste_comp.append({'comp': nom_comp, 'a_naiss': a_naiss, 'a_mort': a_mort})
        print(liste_comp)
    except ValueError:
        print("Veuillez vérifier votre saisie!")
    @Sve@r
    Plus besoin du module copy, si ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> a= [1,2,3]
    >>> b=a.copy()
    >>> a.append(4)
    >>> a
    [1, 2, 3, 4]
    >>> b
    [1, 2, 3]

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    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 833
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par LeNarvalo Voir le message
    @Sve@r
    Plus besoin du module copy, si ?
    Ben sais pas. Comme moi j'avais dit dès le départ que ici ce n'était pas utile je ne vois pas trop pourquoi tu me le redemandes...
    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. [ActionScript] Problème avec boucle 'FOR'
    Par BnA dans le forum Flash
    Réponses: 7
    Dernier message: 02/11/2006, 09h26
  2. [VBS][Débutant] Problème syntaxe boucle For
    Par _alex_ dans le forum VBScript
    Réponses: 2
    Dernier message: 26/07/2006, 14h26
  3. problème dans boucle for de lecture de fichier ini
    Par chourmo dans le forum Delphi
    Réponses: 3
    Dernier message: 06/07/2006, 09h31
  4. [batch]inventaire réseau-problème de boucle "for"
    Par mathieu_r dans le forum Windows
    Réponses: 1
    Dernier message: 23/06/2006, 20h17
  5. [Eval] Problème de boucle for sur des tableaux
    Par battle_benny dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 12/01/2006, 23h55

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