2009-07-26 17 views
121

En mi código de ejemplo a continuación, ¿el contador = 0 es realmente necesario, o hay una manera mejor, más de Python, de obtener acceso a un contador de bucle? Vi algunas PEP relacionadas con los contadores de bucles, pero fueron diferidas o rechazadas (PEP 212 y PEP 281).Contador de bucle de Python en un bucle for

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, salidas:

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

puede simplemente utilizar la propiedad length matriz en lugar del en el bucle método, para i Jim

+2

posible duplicado de [Acceso al índice en Python para bucles] (http://stackoverflow.com/questions/522563/accessing-the-index-in-python-for-loops) –

Respuesta

214

Uso enumerate() así:

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: Usted puede poner opcionalmente paréntesis alrededor counter, option, como (counter, option), si quieres, pero son extraños y normalmente no están en cluded

4

También podría hacer:

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

A pesar de que había encontrado con problemas si hay opciones duplicadas.

+4

O si las opciones son un iterador. –

4

Voy 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 eso significa que voy a estar diciendo options[i] más de un par de veces.

+5

En tal caso, siempre debe usar enumerate() –

+0

gs, ¿y si solo necesita obtener el elemento de vez en cuando, pero necesita el índice cada vez? Parece que en esas situaciones esto podría ser beneficioso porque no estás creando una nueva variable cada vez. –

+1

@gs: sí. Esa respuesta ya estaba publicada, así que estaba publicando una solución alternativa. Como de costumbre, la mejor respuesta depende de los detalles de su situación. –

0

enumerate es lo que estás buscando.

Usted también puede 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() por lo que podría hacer algo como

import itertools 

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