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 !)
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)
....
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.
@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.
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 ?
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.
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
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
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.
je n'avais pas saisi complètement le sens de l'instruction break.
mon programme fonctionne
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.
Python c'est bon, mangez-en.