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
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.
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.
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.
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