Forum Programmation.python Problème affectation liste de liste - boucles imbriquées

Posté par  (site web personnel) . Licence CC By‑SA.
Étiquettes : aucune
0
15
jan.
2022

Bonjour ,
Ci dessous un prog qui permet à partir d'une composition volume de calculer la composition poids comme suit :
% masse = % vol * pme/pmm ( pme étant le poids molaire de l’élément , pmm le poids molaire du mélange , celui ci calcule par ailleurs)
combvp est la composition volume ,fg7mw étant le poids mol des éléments
combvp = [[15, 6, 3, 1, 75],[1,0,21,1,77]]
combwp =[[0,0,0,0,0,0,0],[0,0,0,0,0,0,0]]


an = 0
fg7mw = [18.02, 44.01, 32, 39.94, 28.02] # poids molaire 5 elts
while an < 2 :
for j in range(0,5):
combwp[an][j] = combvp[an][j]*fg7mw[j])/mwc[an]
an = an + 1


Il se trouve que :
le calcul est bien effectué pour an =0 et an = 1 aussi, mais il se trouve que il est affecte aux deux sous listes les résultats du calcul ! je me trouve donc avec le résultat suivant :
an = 0 mw[0]= 27.7 combwp=[[9.7,9.5,3.4,1.4,75.8],[9.7,9.5,3.4,1.4,75.8]]
an = 1 mw[1] = 28.5 combwp=[[0.6,0.,23.5,1.4,74.9],[0.6,0.,23.5,1.4,74.9]]
alors que le resultat voulu est :
combwp =[[9.7,9.5,3.4,1.4,75.8],[0.6,0.,23.5,1.4,74.9]]
J'ai beau chercher , je cale !! dur , dur avec moi python….Qui voit le pb?
J'ai remplacé range par while , toujours pareil !

  • # pythonicité

    Posté par  . Évalué à 4.

    Salut,

    il me semble que tu utilises le nom "mwc" et non "mw" dans ta boucle. Quand je reprends ton code avec le bon nom de variable, j'obtiens le résultat que tu dis attendre.

    De plus il y a une parenthèse fermante en trop dans ton opération arithmétique.

    • [^] # Re: pythonicité

      Posté par  . Évalué à 5.

      Par rapport au titre de mon commentaire, un code un peu plus idiomatique serait le suivant (mais on peut sans doute apporter d'autres améliorations) :
      ```
      combvp = [[15, 6, 3, 1, 75],
      [ 1, 0, 21, 1, 77]]

      fg7mw = [18.02, 44.01, 32, 39.94, 28.02]

      mw = [27.7, 28.5]

      combwp = [ [ combvp[i][j] * fg7mw[j] / mw[i] for j in range(len(combvp[0])) ] for i in range(len(mw)) ]
      ```

      • [^] # Re: pythonicité

        Posté par  . Évalué à 5.

        Et avec la bonne mise en forme :

        combvp = [[15, 6, 3, 1, 75],
                  [ 1, 0, 21, 1, 77]]
        
        fg7mw = [18.02, 44.01, 32, 39.94, 28.02]
        
        mw = [27.7, 28.5]
        
        combwp = [ [ combvp[i][j] * fg7mw[j] / mw[i] for j in range(len(combvp[0])) ] for i in range(len(mw)) ]
  • # resolu

    Posté par  (site web personnel) . Évalué à 1.

    J'ai compris le pb et j'ai pu le résoudre.En début de prog je définis combwp=[[0,0,0….]]*k ,k étant le nombre de combustible,donc les data se copient automatiquement;on résoud le pb en mettant dans la boucle une variable intermédiaire et en affectant à combwp après la boucle.
    Je manque d'un bon bouquin,python pour les nuls c'est nul……
    Merci pour vos participations.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.