【问题标题】:How to iterate a list over and over again?如何一遍又一遍地迭代列表?
【发布时间】:2019-11-01 16:13:37
【问题描述】:

我正在尝试使用 Python 编写一个返回月份名称序列的程序。

例如,如果我输入:

gen = next_month('October')
lst = [next(gen) for i in range(15)]
print (lst)

我应该得到:

['November', 'December', 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August',  'September', 'October', 'November', 'December', 'January'])

但我得到以下代码的索引超出范围错误:

month_names = ['January', 'February', 'March', 'April', 'May', 'June',
                'July', 'August', 'September', 'October', 'November', 'December']

def next_month(name: str) -> str:
    "Return a stream of the following months"
    global month_names
    month_index = month_names.index(name)
    while True:
            yield (month_names[month_index])
            month_index = month_index + 1

只是不知道如何解决它。提前感谢您的任何指导!

【问题讨论】:

  • 请考虑格式化您添加到问题中的代码 sn-ps。它可能会帮助其他人清楚地看到问题并尝试帮助您。

标签: python loops


【解决方案1】:

itertools 有一个函数cycle,它循环一个迭代器:

from itertools import cycle

month_names = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']

for month in cycle(month_names):
    print(month)

家庭作业版:

def gen_cycle(l):
    cnt = 0
    while True:
        yield l[cnt]
        cnt = (cnt+1)%len(l)

【讨论】:

  • 谢谢!抱歉,我忽略了我需要为此编写一个生成器并且不能真正使用任何导入工具...
  • 已更新,但复制 SO 的内容是无法通过考试的。
  • 感谢您的帮助。我不会复制任何东西,我也不会。我花了很多时间试图弄清楚这一点,并试图从专家那里获得一些指导。但我应该更明确地说出来。我正在努力学习和理解事物,而不是复制事物来获得通过。再次感谢您。
  • 祝你旅途愉快。
【解决方案2】:

对于家庭作业的答案可能不是很好,但如果没有硬编码,您可以使用 itertools.countdatetime.datetime 的月份:

def next_month(name):
    date = datetime.strptime(name, '%B')
    for m in count(date.month):
        date = date.replace(month=1+(m%12))
        yield date.strftime('%B')

gen = next_month('October')
print([next(gen) for i in range(15)])

打印出来:

['November', 'December', 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December', 'January']

这也可以使用 while 循环来完成,尽管使用 count 是一种快捷方式

【讨论】:

    猜你喜欢
    • 2015-07-31
    • 1970-01-01
    • 2017-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-30
    • 2014-09-04
    相关资源
    最近更新 更多