93 votes

Comment changer l'index d'une boucle for ?

Supposons que j'aie une boucle for :

for i in range(1,10):
    if i is 5:
        i = 7

Je veux changer i s'il remplit certaines conditions. J'ai essayé mais cela n'a pas fonctionné. Comment dois-je procéder ?

142voto

Volatility Points 12668

Pour votre exemple particulier, cela fonctionnera :

for i in range(1, 10):
    if i in (5, 6):
        continue

Cependant, il est probablement préférable d'opter pour une while boucle :

i = 1
while i < 10:
    if i == 5:
        i = 7
    # other code
    i += 1

A for assigne une variable (dans ce cas i ) à l'élément suivant de la liste/du tableau au début de chaque itération. Cela signifie que, quoi que vous fassiez à l'intérieur de la boucle, i deviendra l'élément suivant. L'élément while n'a pas de restriction de ce type.

35voto

timgeb Points 5966

Un peu plus de détails sur la raison pour laquelle la boucle de la question ne fonctionne pas comme prévu.

Une boucle

for i in iterable: 
    # some code with i

est essentiellement une abréviation pour

iterator = iter(iterable)
while True:
    try:
        i = next(iterator)            
    except StopIteration:
        break
    # some code with i

Ainsi, le for extrait une à une les valeurs d'un itérateur construit à partir de l'objet itérable et reconnaît automatiquement l'épuisement de l'itérateur et s'arrête.

Comme vous pouvez le constater, à chaque itération de la fonction while boucle i est réaffecté Par conséquent, la valeur de i sera remplacée par d'autres réaffectations, quelles qu'elles soient, que vous avez effectuées dans le cadre de la procédure d'autorisation. # some code with i partie.

C'est la raison pour laquelle, for en Python ne sont pas adaptées aux changements permanents de la variable de la boucle et vous devez recourir à une fonction while comme cela a déjà été démontré dans la réponse de Volatility.

4voto

Nerf Herder Points 408

Ce concept n'est pas inhabituel dans le monde C, mais devrait être évité si possible. Néanmoins, voici comment je l'ai mis en œuvre, d'une manière qui m'a semblé claire. Vous pouvez donc placer votre logique de saut dans l'index n'importe où dans la boucle, et un lecteur saura qu'il doit faire attention à la variable de saut, alors que l'intégration d'un i=7 quelque part dans la boucle peut facilement être manquée :

skip = 0
for i in range(1,10):
   if skip:
      skip -= 1
      continue

   if i=5:
      skip = 2

   <other stuff>

0voto

Pranav VS Points 1

L'idée simple est que i prend une valeur après chaque itération, indépendamment de ce à quoi il est assigné à l'intérieur de la boucle, parce que la boucle incrémente la variable itérative à la fin de l'itération et comme la valeur de i est déclarée à l'intérieur de la boucle, elle est simplement écrasée. Vous devriez probablement assigner i à une autre variable et la modifier. Par exemple

for i in range(1,10):
    if i == 5:
        u = 7

et vous pouvez ensuite interrompre la boucle en utilisant "break" à l'intérieur de la boucle pour empêcher toute itération supplémentaire puisque la condition requise a été remplie.

0voto

Anonymouse Points 1

Tout comme timgeb a expliqué que l'index que vous avez utilisé se voyait attribuer une nouvelle valeur au début de la boucle for à chaque fois, la méthode que j'ai trouvée pour fonctionner est d'utiliser un autre index.

Par exemple, voici votre code original :

for i in range(1,10):
    if i is 5:
        i = 7

vous pouvez utiliser celui-ci à la place :

i = 1
j = i
for i in range(1,10):
    i = j
    j += 1
    if i == 5:
        j = 7

De plus, si vous modifiez des éléments d'une liste dans la boucle for, il se peut que vous deviez également mettre à jour la plage en range(len(list)) à la fin de chaque boucle si vous avez ajouté ou supprimé des éléments à l'intérieur de la liste. La façon dont je procède consiste à assigner un autre index pour en garder la trace.

list1 = [5,10,15,20,25,30,35,40,45,50]

i = 0
j = i
k = range(len(list1))
for i in k:
    i = j
    j += 1
    if i == 5:
        j = 7
    if list1[i] == 20:
        list1.append(int(100))
    # suppose you remove or add some elements in the list at here, 
    # so now the length of the list has changed

    k = range(len(list1))
    # we use the range function to update the length of the list again at here
    # and save it in the variable k

Mais il serait tout de même plus pratique d'utiliser la boucle while à la place. Quoi qu'il en soit, j'espère que cela vous aidera.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X