2009-07-26 3 views
121

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

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

Возможно, я должен добавить, что я использую 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 
+0

вы можете просто использовать длину массива свойства вместо ибо в цикле метод для i Jim

+2

Возможный дубликат [Доступ к индексу в циклах Python для циклов] (http://stackoverflow.com/questions/522563/accessing-the-index-in-python-for-loops) –

ответ

214

Использование 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), если вы хотите, но они посторонние и не cluded.

4

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

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

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

+4

Или если параметры являются итераторами. –

4

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

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], чем пара раз.

+5

В таком случае вы всегда должны использовать enumerate() –

+0

gs, что делать, если вам нужно получать элемент каждый раз в то время, но вам нужен индекс каждый раз? Похоже, что в таких ситуациях это может быть полезно, потому что вы каждый раз не создаете новую переменную. –

+1

@ gs: да. Этот ответ уже был опубликован, поэтому я отправлял альтернативное решение. Как обычно, какой ответ лучше всего зависит от деталей вашей ситуации. –

0

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 
Смежные вопросы