Счетчик цикла 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