it-swarm.com.de

Python Schleifenzähler in einer for-Schleife

Ist in meinem folgenden Beispielcode der Zähler = 0 wirklich erforderlich, oder gibt es eine bessere, pythonreichere Möglichkeit, auf einen Schleifenzähler zuzugreifen? Ich habe einige PEPs im Zusammenhang mit Schleifenzählern gesehen, aber sie wurden entweder zurückgestellt oder abgelehnt ( PEP 212 und PEP 281 ).

Dies ist ein vereinfachtes Beispiel für mein Problem. In meiner realen Anwendung wird dies mit Grafiken durchgeführt und das gesamte Menü muss für jeden Frame neu gestrichen werden. Dies demonstriert es jedoch in einer einfachen Textweise, die leicht zu reproduzieren ist.

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

# 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

Beim Ausführen gibt es Folgendes aus:

 [ ] Option 0
 [ ] Option 1
 [*] Option 2
 [ ] Option 3
135
Andre Miller

Verwenden Sie enumerate() wie folgt:

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 können optional Klammern um counter, option Setzen, wie (counter, option), Wenn Sie möchten, aber diese sind nicht relevant und normalerweise nicht enthalten.

239
Evan Fosmark

Sie könnten auch tun:

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

Obwohl Sie auf Probleme stoßen würden, wenn es doppelte Optionen gibt.

4
thedz

Ich mache das manchmal:

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 eher vermeide, wenn es bedeutet, dass ich sagen werde, options[i] mehr als ein paar mal.

4

enumerate ist das, wonach Sie suchen.

Das könnte Sie auch interessieren auspacken :

# 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

Es gibt auch itertools.count() , so dass Sie so etwas tun können

import itertools

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