2009-07-26 21 views
121

नीचे दिए गए मेरे उदाहरण कोड में, काउंटर = 0 वास्तव में आवश्यक है, या क्या एक बेहतर, अधिक पायथन, लूप काउंटर तक पहुंच प्राप्त करने का तरीका है? मैंने लूप काउंटर से संबंधित कुछ पीईपी देखा, लेकिन वे या तो स्थगित या खारिज कर दिए गए (PEP 212 और PEP 281)।लूप के लिए पाइथन लूप काउंटर

यह मेरी समस्या का एक सरल उदाहरण है। मेरे असली एप्लिकेशन में यह ग्राफिक्स के साथ किया जाता है और पूरे मेनू को प्रत्येक फ्रेम को दोबारा तैयार किया जाना चाहिए। लेकिन यह इसे एक साधारण पाठ तरीके से प्रदर्शित करता है जो पुन: उत्पन्न करना आसान है।

शायद मुझे यह भी जोड़ना चाहिए कि मैं पाइथन 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

आप बस पाश में के लिए के बजाय सरणी लंबाई संपत्ति का उपयोग कर सकते कुछ कर सकते हैं विधि, मैं Jim

+2

संभावित डुप्लिकेट [पाइथन में सूचकांक तक पहुंचने के लिए] [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 

अगर वहाँ डुप्लिकेट विकल्प हैं हालांकि आपको समस्या आ जाती होगी। हालांकि मैं इस से बचने के लिए अगर यह मतलब है कि मैं समय की एक जोड़ी से options[i] अधिक कह रहे होंगे करते हैं

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] 

:

+4

या यदि विकल्प एक पुनरावर्तक है। –

4

मैं कभी कभी यह करूँगा।

+5

ऐसे मामले में आपको हमेशा एन्युमरेट() –

+0

जीएस का उपयोग करना चाहिए, अगर आपको केवल थोड़ी देर में तत्व प्राप्त करने की आवश्यकता है, लेकिन आपको हर बार इंडेक्स की आवश्यकता है? ऐसा लगता है कि उन परिस्थितियों में यह फायदेमंद हो सकता है क्योंकि आप हर बार एक नया चर नहीं बना रहे हैं। –

+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 
संबंधित मुद्दे