Compteur de boucle Python dans une boucle for

Dans mon exemple de code ci-dessous, le counter = 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 PEPs liés aux compteurs de boucle, mais ils ont été différés ou 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 l'ensemble du menu doit être repeint chaque image. Mais cela le démontre d'une manière simple de texte qui est facile à reproduire.

Peut-être que je devrais aussi ajouter que J'utilise python 2.5, bien que je sois toujours intéressé s'il y a un moyen spécifique à 2.6 ou supérieur.

# 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 sort:

 [ ] Option 0
 [ ] Option 1
 [*] Option 2
 [ ] Option 3
127
demandé sur Andre Miller 2009-07-27 01:05:26

4 réponses

Utilisation enumerate() comme ceci:

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)

Note : Vous pouvez éventuellement mettre des parenthèses autour de counter, option, comme (counter, option), Si vous le souhaitez, mais elles sont étrangères et ne sont normalement pas incluses.

226
répondu Evan Fosmark 2014-10-15 18:29:26

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 y a des options en double.

4
répondu thedz 2009-07-26 21:11:08

Je vais parfois faire 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'ai tendance à éviter cela si cela signifie que je vais dire options[i] plus d'une couple de fois.

4
répondu Laurence Gonsalves 2009-07-26 21:28:17

enumerate est ce que vous cherchez.

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

Aussi, il y a itertools.count() donc, vous pourriez 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
répondu Martin Thoma 2017-09-10 14:43:10