Счетчик цикла Python в цикле for

В моем примере, приведенном ниже, необходим ли счетчик = 0, или есть лучший, более Python, способ получить доступ к счетчику циклов? Я видел несколько PEP, связанных с счетчиками циклов, но они были либо отложены, либо отклонены (PEP 212 и PEP 281).

Это упрощенный пример моей проблемы. В моем реальном приложении это делается с графикой, и все меню должно быть перекрашено в каждый кадр. Но это демонстрирует это простым текстовым способом, который легко воспроизвести.

Возможно, мне следует добавить, что я использую Python 2.5, хотя меня все еще интересует, если есть способ, характерный для 2.6 или выше.

# 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

При запуске он выдает:

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

Ответ 1

Используйте enumerate() так:

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)

Примечание. Вы можете по желанию поставить круглые скобки вокруг counter, option, например (counter, option), если хотите, но они посторонние и обычно не включены.

Ответ 2

Вы также можете сделать:

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

Несмотря на то, что вы столкнулись с проблемами, если есть повторяющиеся параметры.

Ответ 3

Я иногда делаю это:

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]

Хотя я стараюсь избегать этого, если это означает, что я буду говорить options[i] более двух раз.

Ответ 4

enumerate - это то, что вы ищете.

Вас также может заинтересовать 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

Кроме того, есть itertools.count(), чтобы вы могли сделать что-то вроде

import itertools

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