loops - español - Contador de bucle Python en un bucle for
for i in range python español (4)
A veces hago esto:
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]
Aunque tiendo a evitar esto si significa que voy a decir options[i]
más de un par de veces.
En mi código de ejemplo a continuación, ¿realmente se requiere el contador = 0, o hay una manera mejor, más Python, de obtener acceso a un contador de bucles? Vi algunas PEP relacionadas con los contadores de bucles, pero fueron diferidas o rechazadas ( PEP 212 y PEP 281 ).
Este es un ejemplo simplificado de mi problema. En mi aplicación real, esto se hace con gráficos y todo el menú debe ser repintado en cada cuadro. Pero esto lo demuestra en una forma sencilla de texto que es fácil de reproducir.
Quizás también debería agregar que estoy usando Python 2.5, aunque todavía estoy interesado si hay una forma específica para 2.6 o superior.
# 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
Cuando se ejecuta, produce:
[ ] Option 0
[ ] Option 1
[*] Option 2
[ ] Option 3
También podrías hacer:
for option in options:
if option == options[selected_index]:
#print
else:
#print
Aunque te encuentras con problemas si hay opciones duplicadas.
enumerate
es lo que estás buscando.
También podría estar interesado en unpacking :
# 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
Además, hay itertools.count()
para que puedas hacer algo como
import itertools
for index, el in zip(itertools.count(), [28, 4, 1990]):
print(el) # prints the numbers 28, 4, 1990
Use enumerate()
como sigue:
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 : Opcionalmente puede poner paréntesis alrededor del counter, option
, como (counter, option)
, si lo desea, pero son extraños y normalmente no están incluidos.