155 votes

Compteur de boucle Python dans une boucle for

Dans mon exemple de code ci-dessous, le compteur = 0 est-il vraiment nécessaire, ou existe-t-il un meilleur moyen, plus Python, d'accéder à un compteur de boucle ? J'ai vu quelques PEP liés aux compteurs de boucle, mais ils ont été soit reportés, soit rejetés ( PEP 212 y PEP 281 ).

Voici un exemple simplifié de mon problème. Dans mon application réelle, cela se fait avec des graphiques et le menu entier doit être repeint à chaque image. Mais cet exemple le démontre d'une manière simple et facile à reproduire.

Peut-être devrais-je également ajouter que j'utilise Python 2.5, bien que je sois toujours intéressé s'il existe un moyen spécifique à la version 2.6 ou supérieure.

# Draw all the options, but highlight the selected index
def draw_menu(options, selected_index):
    counter = 0
    for option in options:
        if counter == selected_index:
            print " [*] %s" % option
        else:
            print " [ ] %s" % option
        counter += 1

options = ['Option 0', 'Option 1', 'Option 2', 'Option 3']

draw_menu(option, 2) # Draw menu with "Option2" selected

Quand il est exécuté, il sort :

 [ ] Option 0
 [ ] Option 1
 [*] Option 2
 [ ] Option 3

0 votes

Pouvez-vous simplement utiliser la propriété de longueur du tableau au lieu de la méthode for in loop, pour i < array.length ?

262voto

Evan Fosmark Points 17732

Utilisez enumerate() comme ça :

def draw_menu(options, selected_index):
    for counter, option in enumerate(options):
        if counter == selected_index:
            print " [*] %s" % option
        else:
            print " [ ] %s" % option    

options = ['Option 0', 'Option 1', 'Option 2', 'Option 3']
draw_menu(options, 2)

Nota : Vous pouvez éventuellement mettre des parenthèses autour de counter, option comme (counter, option) si vous voulez, mais ils sont étrangers et ne sont pas normalement inclus.

6voto

Laurence Gonsalves Points 50783

Je fais parfois ça :

def draw_menu(options, selected_index):
    for i in range(len(options)):
        if i == selected_index:
            print " [*] %s" % options[i]
        else:
            print " [ ] %s" % options[i]

Bien que j'ai tendance à éviter cela si cela signifie que je vais dire options[i] plus de deux fois.

5 votes

Dans un tel cas, vous devez toujours utiliser enumerate()

0 votes

Gs, que se passe-t-il si vous n'avez besoin de récupérer l'élément qu'une fois de temps en temps, mais que vous avez besoin de l'index à chaque fois ? Il semble que dans ces situations, cela pourrait être bénéfique car vous ne créez pas une nouvelle variable à chaque fois.

1 votes

@gs : oui. Mais cette réponse a déjà été postée, donc je postais une solution alternative. Comme d'habitude, la meilleure réponse dépend des détails de votre situation.

4voto

thedz Points 3494

Vous pouvez aussi le faire :

 for option in options:
      if option == options[selected_index]:
           #print
      else:
           #print

Bien que vous rencontriez des problèmes s'il y a des options en double.

4 votes

Ou si les options sont un itérateur.

3voto

moose Points 4945

enumerate est ce que vous recherchez.

Vous pourriez également être intéressé par déballage :

# The pattern
x, y, z = [1, 2, 3]

# also works in loops:
l = [(28, 'M'), (4, 'a'), (1990, 'r')]
for x, y in l:
    print(x)  # prints the numbers 28, 4, 1990

# and also
for index, (x, y) in enumerate(l):
    print(x)  # prints the numbers 28, 4, 1990

Il y a aussi itertools.count() Vous pourriez donc faire quelque chose comme

import itertools

for index, el in zip(itertools.count(), [28, 4, 1990]):
    print(el)  # prints the numbers 28, 4, 1990

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