Как перебирать список снова и снова? - PullRequest
0 голосов
/ 01 ноября 2019

Я пытаюсь написать, что будет возвращать последовательность названий месяцев с 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

Просто не уверен, как это исправить. Заранее спасибо за любое руководство!

Ответы [ 2 ]

1 голос
/ 01 ноября 2019

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)
0 голосов
/ 01 ноября 2019

Вероятно, не очень хорошо для ответа на домашнюю работу, но без жесткого кодирования месяцев, которые вы можете использовать itertools.count и datetime.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 является ярлыком

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...