Partage
  • Partager sur Facebook
  • Partager sur Twitter

boucle for "dynamique"

    24 mai 2016 à 10:12:28

    Bonjour,

    Je fais une boucle sur les valeurs d'une liste mais celle-ci est modifiée au cours de la boucle.

    Dans mon cas particulier, cette liste contient à la 1ère itération dans la boucle une seule valeur et selon les "résultats" fournis par ma boucle la liste contiendra ensuite 4 autres valeurs. Comment faire pour qu'à la 2ème itération dans ma boucle ce soit bien cette nouvelle liste sur laquelle la boucle se fait ?

    par exemple :

    ma_liste = [4]

    for j in ma_liste :

         ....

         ma_liste = [2,7,8,5] #à la fin de la 1ère itération

    J'ai cherché sur internet et vu trucs sur "iter" et les compréhensions de liste mais je vois trop en quoi cela m'aide...

    Je précise que je suis novice en python (pas dur à deviner !)

    merci de votre aide

    • Partager sur Facebook
    • Partager sur Twitter
      24 mai 2016 à 10:32:05

      je pense que tu vas devoir changer de boucle for

      cad : que si tu change ta liste tu "break" ton for pour en relancé un autre

      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        24 mai 2016 à 10:40:32

        Tu ne peux pas modifier une liste pendant que tu itères dessus. Je pense que tu es dans un cas où c'est une boucle while qu'il te faut. Par exemple, la suite de syracuse :

        n, ls = 15, []
        while n != 1:
            ls.append(n)
            if n % 2:
                n = 3 * n + 1
            else:
                n = n // 2
        ls.append(n)
        
        • Partager sur Facebook
        • Partager sur Twitter
          24 mai 2016 à 11:11:04

          celthon a écrit:

          Tu ne peux pas modifier une liste pendant que tu itères dessus.

          Si, si, tu peux l'extend ...

          Sinon:

          liste = [4]
          while liste:
              for foo in liste:
                  generation nouvelle_liste
              liste = nouvelle_liste ou [] si fin de traitement



          -
          Edité par josmiley 24 mai 2016 à 11:16:45

          • Partager sur Facebook
          • Partager sur Twitter

          Python c'est bon, mangez-en. 

            24 mai 2016 à 14:00:51

            ClemB1 a écrit:

            par exemple :

            ma_liste = [4]
            for j in ma_liste :
            
             ....
            ma_liste = [2,7,8,5] #à la fin de la 1ère itération
            

            </pre>

            Donc à la première itération j valait 4. Et à la deuxième itération, que veux-tu que j prenne comme valeur ? 7 ? 2 ? Autre chose ? Car avec tes explications, c'est pas très clair.

            -
            Edité par Dan737 24 mai 2016 à 14:01:03

            • Partager sur Facebook
            • Partager sur Twitter
              24 mai 2016 à 17:34:52

              @Racers, merci de ta réponse mais ce n'est as très pratique de faire une autre boucle, j'ai bcp de choses dedans et ça va compliquer...

              @celthon et josmiley, je suis en train d'explorer la possibilité du while mais pour le moment ça va dans la bonne voie !

              @Dan737, je ne peux pas savoir à l'avance ce que ma liste va contenir, je connais juste la liste initiale donc avant la 1ère itération.

              J'ai écrit [2,7,8,5] mais c'est un exemple, le contenu de la liste dépend des résultats donnés par le code, je ne peux pas la connaître à l'avance. La seule info dont je dispose sur cette liste c'est qu'elle contient 4 valeurs qui sont des nombres.

              • Partager sur Facebook
              • Partager sur Twitter
                24 mai 2016 à 20:18:33

                Salut,

                Ma question portait sur l'exemple donné. Je ne comprends pas le comportement attendu pour la deuxième itération. Prends-tu le deuxième éléments de la liste modifiée ?? Si oui, le premier élément qui a changé au premier tour de boucle ne sera plus considéré. Est-ce normal ?

                • Partager sur Facebook
                • Partager sur Twitter
                  25 mai 2016 à 8:52:54

                  A la 2ème itération je parcours ma liste [2,7,8,5] jusqu'à ce que mon code trouve une solution pour l'une de ses valeurs.

                  Par exemple, les valeurs 2 puis 7 ne fournissent aucune solution valable, alors le code essaye avec 8. S'il trouve une solution pour cette valeur alors je vais construire une nouvelle liste sur laquelle boucler, par exemple [4,11,9,10]. Si la valeur 8 ne fournit pas de solution alors le code examine la valeur 5.

                  • Partager sur Facebook
                  • Partager sur Twitter
                    25 mai 2016 à 9:29:37

                    Ok, ça me parait plus clair alors. Racers avait donc raison. Il te faudra bien 2 boucles imbriquées. La boucle intérieure se contente de parcourir une liste donnée. La boucle extérieure fournit une liste à parcourir à la boucle intérieure.

                    Tu n'expliques par contre pas quand ces itérations doivent s'arrêter. Quel est la condition de sortie ? Quand tu n'as plus aucune solution ? Quand il ne reste qu'un élément ?

                    Quoi qu'il en soit, voici schématiquement à quoi ça pourrait ressembler:

                    def process(valeur):
                    
                    # Faire ce qu'il faut avec une valeur
                    # Si solution possible
                        return [2, 7, 8, 5] # Juste un exemple
                    # Else
                    return []
                    

                    def find_solution(valeurs):

                    for valeur in valeurs:
                        solution = process(valeur) # process retourne une liste de solutions
                                                   # Si pas de solutions, retourne []
                        if solution:
                            # solution trouvée
                            return solution
                    # Aucune solution trouvée
                    return []
                    

                    valeurs = [4] while True:

                    solution = find_solution(valeurs) 
                    
                    valeurs = solution
                    if len(valeurs) == 1:
                        # Condition de sortie pour résultat final
                        break
                    

                    valeurs contient notre solution

                    </pre>

                    -
                    Edité par Dan737 25 mai 2016 à 9:30:07

                    • Partager sur Facebook
                    • Partager sur Twitter
                      27 mai 2016 à 18:06:28

                      merci Dan 737, je suis en train de mettre au point tout ça mais j'ai une question

                      Comment écire que si une certaine condition est remplie alors il doit refaire une boucle ? Je fais une boucle sur une liste contenant des nombres. Sous une certaine condition cette liste change, à savoir qu'elle contient d'autres chiffres. Je veux alors qu'il recommence la boucle sur cette nouvelle liste mais s'il n'a pas terminé de boucler sur la précédente.

                      while elem_check and compteur<nb_max:
                          for elem in elem_check:
                              ...
                              if condition:
                                  elem_check=elem_check_modifie
                              #il doit alors recommencer le for elem in... etc
                      
                      
                      • Partager sur Facebook
                      • Partager sur Twitter
                        28 mai 2016 à 15:30:27

                        Salut. Tu dois juste utiliser un break dans ton if. Si tu ne sais pas ce que ça fait, il faut lire un tuto. Une fois le break rencontré, tu vas sortir de ta boucle for et comme tu es également à la fin de la boucle while, on va revenir à la ligne 1 et évaluer la condition : while elem_check and compteur<nb_max. Si c'est bien le cas, on passe à la ligne 2 et on recommence à itérer sur elem_check qui a été modifié en ligne 5.

                        • Partager sur Facebook
                        • Partager sur Twitter
                          28 mai 2016 à 17:20:04

                          merci beaucoup pour ta réponse et ton aide :)

                          je n'avais pas saisi complètement le sens de l'instruction break.

                          mon programme fonctionne :)

                          • Partager sur Facebook
                          • Partager sur Twitter

                          boucle for "dynamique"

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                          • Editeur
                          • Markdown