Python créer des listes avec itérations par boucles
Résoludef 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
listet
sortedavec la boucle for.
Merci d'avance
- Modifier le programme afin que à chaque itération de la boucle
- Modifier dns - Guide
- Programme demarrage windows - Guide
- Modifier liste déroulante excel - Guide
- Vous avez besoin d'une autorisation de la part de système pour modifier ce dossier - Guide
- Comment modifier un tableau sur word - Guide
26 réponses
- 1
- 2
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.
En Python, l’indentation est primordiale, or par défaut le site ne la conserve pas.
Pour la conserver il faut utiliser les balises de code. Voir ce petit tuto https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
On pourra commencer à essayer de t’aider quand tu auras reposté correctement ton code.
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)
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionRegarde donc le message 5, et ensuite ici https://lite.qwant.com/?q=python+fonction+retourner+plusieurs+valeurs&client=opensearch
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é.
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.
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
Essaye avec un ou des
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" )
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" )
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
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.
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()))
<< 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()))
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"
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.
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 (
idans mon exemple) et la valeur itérée (
xdans mon exemple)
Bonne chance
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 ?
whileet non le
for.
Malheureusement, avec
while, on ne peut pas utiliser
enumerate, car
whilene 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
whilecomporte des
continueet/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
- 1
- 2