web-dev-qa-db-ja.com

Python forループのループカウンター

以下の私のコード例では、counter = 0は本当に必要ですか、それともループカウンターにアクセスするためのより良い、より多くのPythonの方法がありますか?ループカウンターに関連するPEPをいくつか見ましたが、遅延または拒否されました( PEP 212 および PEP 281 )。

これは私の問題の簡単な例です。私の実際のアプリケーションでは、これはグラフィックスで行われ、メニュー全体を各フレームで再描画する必要があります。しかし、これは、簡単に再現できる簡単なテキストの方法でそれを示しています。

2.6以降に固有の方法があるかどうかはまだ興味がありますが、Python 2.5を使用していることも追加する必要があります。

# 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
132
Andre Miller

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)をカッコで囲むことができますが、それらは無関係で通常は含まれません。

237
Evan Fosmark

次のこともできます。

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

ただし、オプションが重複していると問題が発生します。

4
thedz

私は時々これをします:

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 はあなたが探しているものです。

npacking にも興味があるかもしれません:

# 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
1
Martin Thoma