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 :

Pb de modification de liste dans une boucle for


Sujet :

Python

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    223
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 223
    Points : 58
    Points
    58
    Par défaut Pb de modification de liste dans une boucle for
    Bonjour à tous !

    débutant sous python, j'ai un problème bien étrange que je ne comprends pas ...

    Je parcours une liste, pendant ce parcours, je créer un dictionnaire, pour creer une autre liste à partir de ce dictionnaire.

    L'exemple est très simple, j'ai même initialisé ma 1ière liste en dur pour le test :

    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
     
            listMetasFound=["machin", "truc", "bidule", "chouette"]
     
            dictSetMetadataGridField={}
            listSetMetadataGridField=[]
     
            for i_meta in range(len(listMetasFound)):
     
                print "\nlistSet 2", listSetMetadataGridField             
                dictSetMetadataGridField["content"]=listMetasFound[i_meta]
     
                print "\nlistSet 3", listSetMetadataGridField
                print " \n ----------------- APPEND ------------------ \n"
                listSetMetadataGridField.append(dictSetMetadataGridField)
     
     
            print " \n*** End ***\n"    
            print listSetMetadataGridField
    Le problème, c que des que j'initialise dictSetMetadataGridField, le contenu de ma liste se modifie sans rien que je fasse. Et tous les élements de ma liste prennent la valeur du dictionnaire en cours ...

    Voici ce que m'affiche la console :

    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
    
    listSet 2 []
    
    listSet 3 []
    
    
    --------------- APPEND --------------- 
    
    
    listSet 2 [{"content":"machin"}]
    
    listSet 3 [{"content":"truc"}]
    
    voila deja ici c pas normal !! 
    
    --------------- APPEND --------------- 
    
    listSet 2 [{"content":"truc", "content":"truc"}]
    
    listSet 3 [{"content":"bidule"}, {"content":"bidule"}]
    
    Pareil !! 
    
    --------------- APPEND ---------------
    Je ne comprends vraiment pas, pouvez vous m'aider ??

    Merci bien !

    @+.

  2. #2
    Membre averti
    Homme Profil pro
    Responsable du parc et des réseaux de télécommunication
    Inscrit en
    Mai 2003
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable du parc et des réseaux de télécommunication
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2003
    Messages : 290
    Points : 388
    Points
    388
    Par défaut
    Bonjour,
    Dans ton code tu ajoutes dictSetMetadataGridField à ta liste, mais la valeur de "content" change à chaque itération.
    Je ne sais pas ce que tu veux obtenir, mais si c'est une liste du type :
    [{'content': 'machin'}, {'content': 'truc'}, {'content': 'bidule'}, {'content': 'chouette'}]

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    listMetasFound=["machin", "truc", "bidule", "chouette"]
    listSetMetadataGridField=[{'content':i} for i in listMetasFound]
    print listSetMetadataGridField

  3. #3
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    223
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 223
    Points : 58
    Points
    58
    Par défaut
    Oui, c bien une liste de ce type que je veux obtenir ...

    Mais je comprends pas bien, oui la valeur de content change, mon dictionnaire est ecrasé, ok, pour ajouter un dictionnaire avec les même clés, mais avec ds valeurs différentes à ma liste. Mais je ne vois pas pk ma liste est ecrasée aussi ...

    Cela veut dire qu'on ne pourait pas faire ca par exemple ??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    listMetasFound=["machin", "truc", "bidule", "chouette"]
    listSetMetadataGridField=[]
    str=""
     
    for i in range(len(listMetasFound)):
      str="valeur %s", % (listMetasFound[i])
      listSetMetadataGridField[i].append(str)


  4. #4
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    223
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 223
    Points : 58
    Points
    58
    Par défaut
    Citation Envoyé par schnito
    Oui, c bien une liste de ce type que je veux obtenir ...

    Mais je comprends pas bien, oui la valeur de content change, mon dictionnaire est ecrasé, ok, pour ajouter un dictionnaire avec les même clés, mais avec ds valeurs différentes à ma liste. Mais je ne vois pas pk ma liste est ecrasée aussi ...

    Cela veut dire qu'on ne pourait pas faire ca par exemple ??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    listMetasFound=["machin", "truc", "bidule", "chouette"]
    listSetMetadataGridField=[]
    str=""
     
    for i in range(len(listMetasFound)):
      str="valeur %s", % (listMetasFound[i])
      listSetMetadataGridField[i].append(str)

    bon si ca ca marche ...

    J'ai modifié mon code, en créeant à chaque fois un nouveau dico

    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
     
            objElementHead=objHtmlTree.find("head")
            listMetasFound=objElementHead.findall("meta")
     
            dictSetMetadataGridField={}
            listSetMetadataGridField=[]
     
            for i_meta in listMetasFound:
                if(i_meta.get("name")!=None):
                    strFirstAttributName="name"
                    strFirstAttributValue=i_meta.get("name")
                else:
                    strFirstAttributName="html-equiv"
                    strFirstAttributValue=i_meta.get("html-equiv") 
     
                strContent=i_meta.get("content")
     
                dictSetMetadataGridField={"firstAttributName":strFirstAttributName, "firstAttributValue":strFirstAttributValue, "content":strContent}
                listSetMetadataGridField.append(dictSetMetadataGridField)
     
            print listSetMetadataGridField

    Comme ca ca marche, mais bon je comprends pas trop quand même.

    Si tu comprends ce qui se passe pierjean je veux bien que tu m'expliques ...

    Merci à toi !

    @+.

  5. #5
    Membre averti
    Homme Profil pro
    Responsable du parc et des réseaux de télécommunication
    Inscrit en
    Mai 2003
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable du parc et des réseaux de télécommunication
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2003
    Messages : 290
    Points : 388
    Points
    388
    Par défaut
    Mais je comprends pas bien, oui la valeur de content change, mon dictionnaire est ecrasé, ok, pour ajouter un dictionnaire avec les même clés, mais avec ds valeurs différentes à ma liste. Mais je ne vois pas pk ma liste est ecrasée aussi ...
    Ta liste n'est pas écrasée. Elle contient n références vers ton dictionnaire. Si tu modifies ton dico, tu n'aura pas le même résultat:
    Essaies :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    dico={'a':1,'b':2}
    l=[]
    l.append(dico)
    print l
    dico['c']=3
    print l
    Dans ton 1er post :
    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
    listMetasFound=["machin", "truc", "bidule", "chouette"]
    
    dictSetMetadataGridField={}
    listSetMetadataGridField=[]
    
    for i_meta in range(len(listMetasFound)):
         
        print "\nlistSet 2", listSetMetadataGridField             
        dictSetMetadataGridField["content"]=listMetasFound[i_meta]
        
        print "\nlistSet 3", listSetMetadataGridField
        print " \n ----------------- APPEND ------------------ \n"
        listSetMetadataGridField.append(dictSetMetadataGridField.copy()) 
        print dictSetMetadataGridField
    
    print " \n*** End ***\n"    
    print listSetMetadataGridField

  6. #6
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    223
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 223
    Points : 58
    Points
    58
    Par défaut
    Merci beaucoup l'ami.

    J'ai saisi !

    @+.

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

Discussions similaires

  1. Modifier une map/liste dans une boucle
    Par Invité dans le forum Groovy
    Réponses: 1
    Dernier message: 31/10/2011, 08h55
  2. [Batch] Modification des paramètres d'entrée dans une boucle FOR
    Par reppier dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 15/06/2009, 15h23
  3. [bash]Modification de paramètres dans une boucle
    Par troumad dans le forum Shell et commandes GNU
    Réponses: 18
    Dernier message: 28/10/2007, 16h05
  4. Réponses: 2
    Dernier message: 28/08/2006, 18h17
  5. Réponses: 3
    Dernier message: 01/09/2005, 11h56

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