Python créer des listes avec itérations par boucles

Résolu
Thomasdu33 -  
mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,

def f():
    a = 0
    for x in range(2, 10):
     while x != 1: 
        if x % 2 == 1: 
            x = x * 3 + 1 
        else:   
            x = x / 2 
            a = a + 1
        print(x)
        yield x
    print(a)
print("-" * 78)
print(max(f()))
print("-" * 78)
  • Je dois modifier ce programme pour afficher 2 listes après la boucle.
  • Je dois créer une liste pour afficher de 2 à 10, le nombre d'itérations correspondant, et la liste doit être triée sur le nombre d'itérations, du plus grand nombre au plus petit.
  • Avec la deuxième liste affiche, pour chaque entier de 2 à 10, la plus grande valeur atteinte pour x correspondante, et la liste doit être triée sur la plus grande valeur atteinte, dans l'ordre décroissant.


En fait je n'arrive pas à agencer les fonctions
list
et
sorted
avec la boucle for.

Merci d'avance

26 réponses

  • 1
  • 2
Résumé de la discussion

Le problème consiste à faire évoluer pour x allant de 2 à 10 une suite de Collatz et à afficher deux listes après la boucle : itérations par x et maximum atteint, triées différemment. Des éléments clé : enregistrer le nombre d’itérations pour chaque x et le maximum atteint, puis utiliser sorted avec reverse pour obtenir les listes dans l’ordre désiré. En pratique, on peut accumuler des paires (x, itérations) et (x, max_x) dans des listes ou des dictionnaires, puis les trier selon le deuxième élément. Des discussions techniques évoquent aussi l’utilisation d’un compteur séparé pour le while, afin de compter correctement les itérations sans interrompre le flux des calculs principaux.

Généré automatiquement par IA
sur la base des meilleures réponses
  1. Thomasdu33
     
    def f():
        a = 0
        for x in range(2, 10):
         while x != 1: 
            if x % 2 == 1: 
                x = x * 3 + 1 
            else:   
                x = x / 2 
                a = a + 1
            print(x)
            yield x
        print(a)
    print("-" * 78)
    print(max(f()))
    print("-" * 78)
    
    0
  2. Utilisateur anonyme
     
    Est ce que tu sais comment une fonction peut retourner une liste? deux listes?
    0
  3. Utilisateur anonyme
     
    Et en attendant, je te propose de modifier un peu ton code comme ça
    def f():
        a = 0
        for x in range(2, 10):
         while x != 1: 
            if x % 2 == 1: 
                x = x * 3 + 1 
            else:   
                x = x / 2 
                a = a + 1
            print("x ", x)
            yield x
        print("a ", a)
    print("-" * 78)
    print(max(f()))
    print("-" * 78)


    et d'observer ce qui se passe
    0
  4. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  5. Thomasdu33
     
    Non pas vraiment ou pas exactement, pas deux en tout cas.
    0
  6. Thomasdu33
     
    Rebonjour,

    J'ai vu que cela associe les nombres obtenus grâce aux boucles à
    x
    , mais c'est tout pour moi.

    Je n'arrive toujours pas à intégrer dans mon programme un moyen de lister pour chaque nombre dans la rangée, les nombres obtenus grâce aux boucles de ce nombre.

    après j'ai trouvé comment les trier en décroissance avec la fonction
    sorted()
    et quelque chose comme
    reverse = True
    .

    def f():
        a = 0
        for x in list(sorted(range(2, 10))):
         while x != 1: 
            if x % 2 == 1: 
                x = x * 3 + 1 
            else:   
                x = x / 2 
                a = a + 1
            print("x ", x)
            yield x
        print("a ", a)
    print("-" * 78)
    print(max(f()))
    print("-" * 78)


    Après, je pense pouvoir retourner les 2 listes grâce à ce qu'on m'a envoyé.
    0
  7. Utilisateur anonyme
     
    Procédons par étape

    trier à cette endroit là
    for x in list(sorted(range(2, 10))):
    ne va rien t'apporter.

    Tu as écrit

    pour afficher de 2 à 10, le nombre d'itérations correspondant.

    Essaye dans un premier temps, avec des prints d'afficher
    "Pour yy, il y a XXX itérations"
    pour chaque nombre de 2 à 10.

    0
    1. Thomasdu33
       
      Bonjour,

      Comment je mets juste la première boucle et les prochaines dans un
      print
      , et ensuite je crois qu'il faut en faire une pour rassembler tous les résultats.

      print(list.range[], list.add[x])
      peut être pour moi
      0
  8. Thomasdu33
     
    Rebonjour,

    J'ai vus que ça associer le x à chaque nombre obtenu par boucle au return. Mais c'est tout ce que j'ai compris.

    Après j'ai trouvé des trucs comme le "reverse = True" et le sorted() et .sort() pour trier les nombres, cependant j'ai pas compris comment mettre dans une list la boucle for.

    def f():
        a = 0
        for x in list(sorted(range(2, 10))):
         while x != 1: 
            if x % 2 == 1: 
                x = x * 3 + 1 
            else:   
                x = x / 2 
                a = a + 1
            print("x ", x)
            yield x
        print("a ", a)
    print("-" * 78)
    print(max(f()))
    print("-" * 78)


    J'ai essayé de faire quelque chose comme ça mais ça ne change rien.
    0
    1. Thomasdu33
       
      J'ai pas reactualisé la page alors j'ai pas vu la réponse
      et j'ai pas reçus de mail bizarrement
      0
  9. Thomasdu33
     
    J'ai fais un truc comme ça:

    def f():
        a = 0
        list = []
        for x in range(2, 10):
         while x != 1: 
            if x % 2 == 1: 
                x = x * 3 + 1 
            else:   
                x = x / 2 
                a = a + 1
            print("x ", x)
            yield x
         list.append(x)
        print("a ", a)
        print(list)
    print("-" * 78)
    print(max(f()))
    print("-" * 78)


    Mais ça me donne ça:
    a  45
    [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]
    52.0
    0
  10. Utilisateur anonyme
     
    Je te dis de procéder par étape.
    Essaye avec un ou des
    print
    d’afficher le texte que je t’ai propose au message #10, dans la fonction

    0
  11. Thomasdu33
     
    J'ai fais ça, mais je ne sais pas quoi mettre à la place de XXX.

    def f():
        a = 0
        for x in range(2, 10):
         while x != 1: 
            if x % 2 == 1: 
                x = x * 3 + 1 
            else:   
                x = x / 2 
                a = a + 1
            print("x ", x)
            yield x
            
        print("a ", a)
    print("-" * 78)
    print(max(f()))
    print("-" * 78)
    print("Pour " +x+ ", il y a " XXX " itérations" )
    0
  12. Thomasdu33
     
    J'ai fais ça, mais je ne sais pas quoi mettre à la place des XXX

    def f():
        a = 0
        for x in range(2, 10):
         while x != 1: 
            if x % 2 == 1: 
                x = x * 3 + 1 
            else:   
                x = x / 2 
                a = a + 1
            print("x ", x)
            yield x
            
        print("a ", a)
    print("-" * 78)
    print(max(f()))
    print("-" * 78)
    print("Pour " +x+ ", il y a " XXX " itérations" )
    0
  13. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    Bonjour

    Par rapport au message #17 : J'ai fait ça, mais je ne sais pas quoi mettre à la place de XXX.

    Tu peux compter le nombre de fois où tu as itérer avec
    enumerate
    , peu importe la nature de l'itérable (générateur, liste, etc.) :

    l = [10, 20, 30] # Ou n'importe quel itérable
    for (i, x) in enumerate(l):
        print(i, x)


    Bonne chance
    0
  14. Thomasdu33
     
    Maintenant j'ai fais ça, qui me donne le nombre de boucle par itération.
    Cependant il me faut qu'au print que je puisse avoir une décroissance.

    def f():
        
        l = [2,3,4,5,6,7,8,9,10] # Ou n'importe quel itérable
        for (i, x) in enumerate(l):
         a = 0
         while x != 1: 
            if x % 2 == 1: 
                x = x * 3 + 1 
            else:   
                x = x / 2 
                a = a + 1
            yield x
            print(i+1, x)
         print("a ", a)
        
        
    print("-" * 78)
    print(max(f()))
    print("-" * 78)


    J'ai trouvé ceci, mais je n'arrive pas à l'utiliser ou je ne sais pas quoi utiliser d'autre.

    x.sort(reverse = True)

    mais je crois qu'il me faudrait réussir à mettre les nombres obtenus dans une liste pour pouvoir ensuite les triers.
    0
  15. Utilisateur anonyme
     
    Bonsoir

    non tu n'as toujours pas le nombre d'itération par entier de 2 à 10.
    Essaye ça et compte le nombre de "coucou" et compare le avec ta variable a

    def f():
        a = 0
        for x in range(9, 10):
            print("entier : ", x)
            while x != 1: 
                print("coucou")
                if x % 2 == 1: 
                    x = x * 3 + 1 
                else:   
                    x = x / 2 
                    a = a + 1
                yield x
            print("ce que tu crois être les itérations : ", a)
    
    print(max(f()))

    0
    1. Thomasdu33
       
      Bonjour,

      Je pourrais savoir ce qu'est exactement le nombre d'itérations, maintenant pour moi, ce serait les nombres dans le range.
      0
  16. Utilisateur anonyme
     
    Ha oui.
    Une itération c’est un passage dans une boucle.
    0
    1. Thomasdu33
       
      Donc là, j'ai réussis à faire ce qu'ils ont demandés ?

      << La première liste affiche, pour chaque entier de 2 à 10, le nombre d'itérations correspondant >>

      Avec ça:

      def f():
          a = 0
          for x in range(2, 5):
              print("entier : ", x)
              list = []
              while x != 1: 
                  if x % 2 == 1: 
                      x = x * 3 + 1 
                  else:   
                      x = x / 2 
                      a = a + 1
                  list.append(x)
                  print(x)          
              yield x
              print(sorted(list, reverse = True))
          print("ce que tu crois être les itérations : ", a)
      
      print(max(f()))
      0
  17. Utilisateur anonyme
     
    Bonjour

    Non a n’est pas le nombre d’itérations.
    La boucle c’est le while.
    a n’est pas incrémenté à chaque passage dans le while, donc tu ne comptes pas les itérations.
    Tu comptes le nombre de fois ou x est paire
    0
    1. Thomasdu33
       
      Bonjour,

      Alors je n'ai plus qu'à mettre le "a = a + 1" dans la boucle while.
      Et avec le dernier programme ça devrait me donner "3" ?
      0
  18. Utilisateur anonyme
     
    Alors oui, "a = a + 1" doit être déplacé un niveau du while.

    Par contre, ça ne doit pas retourner 3 mais un truc du genre, "pour la valeur d'entrée X il y a eu Y itérations" et ce pour chaque valeur de X.
    Cela dit dans un soucis de cohérence, essaye de renommer ta variable, "a" ça ne fait pas penser à "itération", il y a "i" bien sûr, ou encore "iterations"

    0
    1. Thomasdu33
       
      D'accord, alors j'ai fais un programme comme ça :
      def f():
          i = 0
          for x in range(2, 5):
              print("entier : ", x)
              list = []
              while x != 1: 
                  if x % 2 == 1: 
                      x = x * 3 + 1 
                  else:   
                      x = x / 2 
                      
                  list.append(x)
                  print(x) 
              i = i + 1
              yield x
              print(sorted(list, reverse = True))
          print("nombre d'itérations : ", i)
          print("Pour la valeur "+ str(x) +", il y a "+ str(i) +" itérations")
      
      print(max(f()))


      Mais je ne sais pas comment récupéré le premier x, et ainsi de suite jusqu'au dernier x de la range.
      0
      1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944 > Thomasdu33
         
        Ou plus simplement :

        for (i, x) in enumerate(range(2, 5)):
            print(f"entier : {x}")
        print(f"nombre d'itérations : {i}")


        Note aussi que vu que tu itères sur
        range(2, 5)
        tu sais par avance exactement il y aura 3 itérations...

        Bonne chance
        0
      2. Thomasdu33 > mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention  
         
        ça signifie quoi les f et les {} ?
        0
      3. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944 > Thomasdu33
         
        ça signifie quoi les f et les {} ?

        C'est ce qu'on appelle une f-string. Ce qui est entre accolade est évalué et remplacé par son résultat. Ainsi, écrire
        {x}
        dans une f-string revient à dire "écrit à cet endroit la valeur de la variable
        x
        ". Si tu mettais
        "{x+2}"
        ça remplacerait ce bloc par la valeur de
        x + 2
        . C'est donc une manière assez élégante de spécifier ce que tu veux écrire.

        Les f-strings n'ont rien d'obligatoire et tu peux utiliser la syntaxe que tu connais si tu préfères.

        Ensuite concernant
        enumerate
        : c'est une manière d'itérer sur un itérable (par exemple, un
        range
        , une
        list
        , etc.) et de récupérer simultanément le nombre d'itérations faites (
        i
        dans mon exemple) et la valeur itérée (
        x
        dans mon exemple)

        Bonne chance
        0
  19. Utilisateur anonyme
     
    Bonjour mamiemando.
    Thomas n’en est pas encore là.

    Thomas.

    Pour l’instant on va oublier les listes triées ou pas.
    On va juste essayer d’afficher le nombre d’itérations pour chaque entier.
    Et même on va juste essayer pour un seul entier

    Exécute ceci
    
    def f():
        i = 0
        for x in range(3, 4):
            print("entier : ", x)
            
            while x != 1: 
                print("coucou")
                if x % 2 == 1: 
                    x = x * 3 + 1 
                else:   
                    x = x / 2 
                    
                print("x: ", x) 
            i = i + 1
            yield x
            
        print("Pour la valeur "+ str(x) +", il y a "+ str(i) +" itérations")
    
    print("max: ", max(f ))


    Regarde bien ce qu’affichent les print.
    En fonction doit moins si la phrase "Pour la valeur "+ str(x) +", il y a "+ str(i) +" itérations") est cohérente?
    Pourquoi ?
    0
    1. Utilisateur anonyme
       
      Ha aussi, mamiemando
      Note aussi que vu que tu itères sur range(2, 5) tu sais par avance exactement il y aura 3 itérations...
      Je n’ai pas la même interprétation que toi.
      Pour moi Thomas doit donner le nombre d’itérations de calcul pour 2, puis pour 3 et enfin pour 4.
      0
      1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944 > Utilisateur anonyme
         
        Ah oui c'est possible, tout dépend des itérations dont on parle, donc toi tu dirais que c'est le nombre de fois qu'on boucle sur le
        while
        et non le
        for
        .

        Malheureusement, avec
        while
        , on ne peut pas utiliser
        enumerate
        , car
        while
        ne travaille pas sur un itérable. On est alors obligé de déclarer au préalable un compteur, qu'on incrémente à chaque tour de boucle.

        compteur = 0
        while ...
            ...
            compteur += 1
        print("Nombre d'itérations :", compteur) # ou print(f"Nombre d'itérations : {compteur}")


        Attention toutefois ! Si le
        while
        comporte des
        continue
        et/ou des
        break
        à bien incrémenter le compteur avant d'atteindre l'un de ces mots clés, sinon on oubliera de compter certains tour de boucle...

        Bonne chance
        0
  • 1
  • 2