web-dev-qa-db-fra.com

Python compteur de boucles dans une boucle for

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

Ceci est un exemple simplifié de mon problème. Dans mon application réelle, cela se fait avec des graphiques et tout le menu doit être repeint à chaque image. Mais cela le démontre sous forme de texte simple, facile à reproduire.

Peut-être devrais-je également ajouter que j'utilise Python 2.5, bien que cela m'intéresse toujours 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

Lorsqu'il est exécuté, il génère:

 [ ] Option 0
 [ ] Option 1
 [*] Option 2
 [ ] Option 3
135
Andre Miller

Utilisez enumerate() comme suit:

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)

Remarque : Vous pouvez éventuellement mettre des parenthèses autour de counter, option, comme (counter, option), si vous voulez, mais elles sont superflues et non normalement inclus.

239
Evan Fosmark

Vous pouvez aussi faire:

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

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

4
thedz

Je ferai parfois ceci:

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'aie tendance à éviter cela si cela signifie que je vais dire options[i] plus de deux fois.

4
Laurence Gonsalves

enumerate est ce que vous recherchez.

Vous pourriez aussi être intéressé par décompresser :

# 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

En outre, il existe itertools.count() afin que vous puissiez faire quelque chose comme

import itertools

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