2009-07-26 70 views
121

In meinem Beispiel-Code ist der Zähler = 0 wirklich erforderlich, oder gibt es eine bessere, mehr Python, um Zugriff auf einen Schleifenzähler erhalten? Ich sah ein paar PEPs, die sich auf Schleifenzähler bezogen, aber sie wurden entweder zurückgestellt oder zurückgewiesen (PEP 212 und PEP 281).Python-Schleife Zähler in einer for-Schleife

Dies ist ein vereinfachtes Beispiel für mein Problem. In meiner realen Anwendung wird dies mit Grafiken gemacht und das ganze Menü muss jeden Frame neu gemalt werden. Aber das zeigt es in einem einfachen Text, der einfach zu reproduzieren ist.

Vielleicht sollte ich auch hinzufügen, dass ich Python 2.5 verwende, obwohl ich immer noch interessiert bin, ob es einen Weg gibt, der spezifisch für 2.6 oder höher ist.

# 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 

Wenn er gestartet wird, gibt sie:

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

können Sie einfach die Array-Länge-Eigenschaft verwenden, statt der in Schleife Methode, für i Jim

+2

mögliches Duplikat von [Zugriff auf den Index in Python für Schleifen] (http://stackoverflow.com/questions/522563/accessing-the-index-in-python-for-loops) –

Antwort

214

Verwenden enumerate() wie so:

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) 

Hinweis: Sie optional Klammern um counter, option setzen können, wie (counter, option), wenn Sie wollen, aber sie sind fremd und nicht normalerweise in geschluckt.

4

Sie könnten auch tun:

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

Auch wenn Sie auf Probleme stoßen würde, wenn es doppelte Optionen.

+4

Oder wenn Optionen ein Iterator ist. –

4

Ich werde dies manchmal tun:

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] 

Obwohl ich dies zu vermeiden, sind in der Regel, wenn es bedeutet, werde ich options[i] mehr als ein paar Mal sagen.

+5

In solch einem Fall sollten Sie immer enumerate() –

+0

gs verwenden, was ist, wenn Sie das Element nur hin und wieder bekommen müssen, aber Sie brauchen den Index jedes Mal? Es scheint, als könnte dies in diesen Situationen nützlich sein, da Sie nicht jedes Mal eine neue Variable erstellen. –

+1

@gs: ja. Diese Antwort wurde bereits gepostet, daher posten wir eine alternative Lösung. Wie die Antwort am besten ist, hängt von den Details Ihrer Situation ab. –

0

enumerate ist was Sie suchen.

Sie könnten auch interessiert sein an 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 

Außerdem gibt es itertools.count(), so dass Sie etwas tun könnte, wie

import itertools 

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