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()

不要担心“图形”模块。它是 John Zelle 的 Python 书籍的一部分。重点是我需要将我的范围循环为 5 而不是 4,但是,因为“选项”在 [i] 中,所以上面的这个特定程序将拉动:

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

但是,如果我将 4 更改为 5,它会在列表中查找第 4 项但它不存在,因此它会吐出“IndexError:列表索引超出范围”

我想要实现的是,当程序到达列表末尾时,循环回到列表中的第一个 (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

您可以通过以下两种方式之一实现此目的:

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 次,这里有几种方法可以完成此操作:

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

您可以使用模 (%) 运算符:

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 回答
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()andzip()在达到项目数后停止重复(将值从范围外扔掉)。

于 2012-11-25T21:53:27.910 回答