2

さて、基本的に、私が一緒に投げたこの非常に簡単なプログラムについて少し助けが必要です:

from graphics import *

def main():
win = GraphWin("Text Window", 400, 600)
options = ["Hello", "How", "Are", "You"]
x = 200
y = 20
for i in range(4):
    message = Text(Point(x,y), options[i])
    message.draw(win)
    y = y + 30

main()

'graphics'モジュールについて心配する必要はありません。これは、ジョン・ゼレのPython本の一部です。これのポイントは、4ではなく5の範囲をループする必要があるということです。ただし、「options」は[i]にあるため、上記のこの特定のプログラムは次のようになります。

    0: Hello
    1: How
    2: Are
    3: You
    4: ???

ただし、4を5に変更すると、リスト内の4番目の項目が検索されますが、存在しないため、「IndexError:list indexoutofrange」が出力されます。

私が達成したいのは、プログラムがリストの最後に達したときに、リストの最初の(0)項目にループバックすることです。

例えば、

    for i in range(8):

引き出します:

    0: Hello
    1: How
    2: Are
    3: You
    4: Hello
    5: How
    6: Are
    7: You

私はこのサイトを調べて、成功に至らなかったいくつかのツールを見つけました。これには、役に立たないと思う「列挙」機能が含まれています。

誰かがこれを行う方法に光を当てることができれば、それは大歓迎です!これが可能であれば、ネストされたループなしでもこれを実行できることを願っています。よろしくお願いします。

4

4 に答える 4

4

これは、次の2つの方法のいずれかで実現できます。

1.1。itertools.cycle

c = itertools.cycle(options)
for i in range(anyNumber):
    message = Text(Point(x,y), next(c))
    message.draw(win)
    y = y + 30

2.モジュラス

for i in range(anyNumber):
    message = Text(Point(x,y), options[i%len(options)])
    message.draw(win)
    y = y + 30

編集

コメントの会話から:

リストの内容を4回印刷する場合は、次の2つの方法があります。

options = ["Hello", "How", "Are", "You"]
for i in range(4):
    for e,elem in enumerate(options):
        print("%d: %s" %(4*i+e, elem))

また

options = ["Hello", "How", "Are", "You"]
for e,elem in enumerate(itertools.chain.from_iterable(itertools.repeat(options,4))):
    print("%d: %s" %(e, elem))

また

options = ["Hello", "How", "Are", "You"]
for i in range(4):
    for j in range(len(options)):
        print("%d: %s" %(4*i+j, options[j]))
于 2012-11-25T21:59:41.480 に答える
1

このようなもの?

from itertools import cycle, islice

options = ["Hello", "How", "Are", "You"]

for idx, option in enumerate(islice(cycle(options), 8)):
    print idx, option
于 2012-11-25T21:59:29.993 に答える
0

まず、インデックスではなく、値をループします。Pythonはインデックスとのループを回避するように設計されており、そうすることは厄介で非効率的で醜いです。

for option in options:
    do_something(option)

よりもはるかに優れています:

for option_index in range(len(options)):
    do_something(options[option_index])

ループ動作を取得するには、itertools.cycle()を参照してください。

for option, _ in zip(itertools.cycle(options), range(x)):
    ...

x欲しいアイテムの数はどこですか。ここでは、を使用range()zip()て、アイテムの数に達した後に繰り返しを停止します(範囲から値をスローします)。

于 2012-11-25T21:53:27.910 に答える
0

モジュロ(%)演算子を使用できます。

options = ["Hello", "How", "Are", "You"]
for i in range(8):
    print(options[i % len(options)])

収量

Hello
How
Are
You
Hello
How
Are
You
于 2012-11-25T22:00:04.253 に答える