2009-07-26 59 views
121

Trong mã ví dụ của tôi dưới đây, là bộ đếm 0 thực sự được yêu cầu hay có cách nào tốt hơn, bằng Python, để truy cập vào bộ đếm vòng lặp? Tôi đã thấy một vài PEP liên quan đến các bộ đếm vòng lặp, nhưng chúng bị trì hoãn hoặc bị từ chối (PEP 212PEP 281).Truy cập vòng lặp Python trong vòng lặp for

Đây là ví dụ đơn giản về sự cố của tôi. Trong ứng dụng thực sự của tôi, điều này được thực hiện với đồ họa và toàn bộ menu phải được sơn lại mỗi khung hình. Nhưng điều này thể hiện nó theo một cách văn bản đơn giản dễ tái tạo.

Có lẽ tôi cũng nên thêm rằng tôi đang sử dụng Python 2.5, mặc dù tôi vẫn quan tâm nếu có cách cụ thể là 2.6 hoặc cao hơn.

# 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 

Khi chạy, nó sẽ tạo ra:

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

bạn có thể chỉ cần sử dụng các tài sản dài mảng thay vì cho trong vòng lặp phương pháp, cho tôi Jim

+2

có thể trùng lặp của [Truy cập chỉ mục bằng Python cho vòng lặp] (http://stackoverflow.com/questions/522563/accessing-the-index-in-python-for-loops) –

Trả lời

214

Sử dụng enumerate() như vậy:

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) 

Note: Bạn có thể tùy chọn đặt ngoặc xung quanh counter, option, như (counter, option), nếu bạn muốn, nhưng chúng không liên quan và không bình thường cluded.

4

Bạn cũng có thể làm:

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

Mặc dù bạn muốn chạy vào các vấn đề nếu có những lựa chọn trùng lặp.

+4

Hoặc nếu các tùy chọn là một trình lặp. –

4

Thỉnh thoảng tôi sẽ làm điều này:

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] 

Mặc dù tôi có xu hướng để tránh điều này nếu nó có nghĩa là tôi sẽ nói options[i] hơn một vài lần.

+5

Trong trường hợp này, bạn nên luôn luôn sử dụng liệt kê() –

+0

gs, nếu bạn chỉ cần lấy yếu tố này một lần trong một thời gian, nhưng bạn cần chỉ mục mỗi lần? Dường như trong những tình huống này, điều này có thể có ích bởi vì bạn không tạo ra một biến mới mỗi lần. –

+1

@gs: vâng. Câu trả lời đó đã được đăng mặc dù, vì vậy tôi đã đăng một giải pháp thay thế. Như thường lệ, câu trả lời nào là tốt nhất tùy thuộc vào chi tiết tình huống của bạn. –

0

enumerate là những gì bạn đang tìm kiếm.

Bạn cũng có thể quan tâm 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 

Ngoài ra, có itertools.count() vì vậy bạn có thể làm một cái gì đó giống như

import itertools 

for index, el in zip(itertools.count(), [28, 4, 1990]): 
    print(el) # prints the numbers 28, 4, 1990 
Các vấn đề liên quan