Цикл While вложен в другой цикл while, не позволяющий другим переменным увеличиваться в python

#python #while-loop

Вопрос:

То, Что Я Пытаюсь Сделать:

У нас есть диапазон дат. Как только диапазон будет создан, я пытаюсь «назначить» человека на целую неделю (добавив его в список на определенный день). Затем, как только эта неделя закончится, перейдите к следующему человеку в списке OnCall и назначьте ему полную неделю дежурства, пока мы не охватим все недели.

Проблема:

Он назначает первую неделю первому лицу, но перестает назначать следующего человека в списке. Таким образом, в этом случае Билли получает первую неделю, назначенную ему, но затем остальные 3 недели пустуют, когда им должны быть назначены Тодд, Муз и ди-джей.

Я считаю, что проблема заключается во вложенном цикле while. Из того, что я могу сказать, он выходит из цикла while, но по какой-то странной причине это мешает ему перейти к следующему человеку. Любая помощь была бы потрясающей, так как это сводит меня с ума.

 import datetime

start_date = datetime.date(2021, 11, 1)
end_date = datetime.date(2021, 11, 28)
delta = datetime.timedelta(days=1)
Days = []
while start_date <= end_date:
    taskday = str(start_date)
    taskdaylist = taskday = [taskday]
    Days.append(taskday)
    start_date  = delta

daysLength = len(Days)
daysi = 0

onCall = ["Billy", "Todd", "Moose", "DJ", "Kach", "Darwin", "Freddy", "Todd"]

personcounter = 0
lengthOfonCall = len(onCall)
weekdaycounter = 0
r = 0
weeks = daysLength/7
while r < weeks:
    personOnCall = "OnCall: "   onCall[personcounter]
    while weekdaycounter < 7:
        r = 1   r
        Days[daysi].append(personOnCall)
        weekdaycounter = weekdaycounter   1
        daysi = 1   daysi
    personcounter = 1   personcounter
    weekdaycounter = 0
    if (personcounter == lengthOfonCall):
        personcounter = 0
print(Days)
 

Комментарии:

1. У вас восемь человек. Что должно произойти, если диапазон дат составляет более 8 недель?

2. Это также увеличивает людей. Как только он достигнет длины числа людей, он сбросит счетчик и снова начнет с начала.

Ответ №1:

Я не уверен на 100%, чего вы хотите достичь. Но я думаю, что проблема в том, что вы увеличиваете переменную r внутри вложенного цикла while. Вы должны увеличить его после вложенного цикла while.

Второй совет используйте r = 1 вместо r = 1 r .

Вот вывод из вашего кода после предложенного изменения.

 [['2021-11-01', 'OnCall: Billy'], ['2021-11-02', 'OnCall: Billy'], ['2021-11-03', 'OnCall: Billy'], ['2021-11-04', 'OnCall: Billy'], ['2021-11-05', 'OnCall: Billy'], ['2021-11-06', 'OnCall: Billy'], ['2021-11-07', 'OnCall: Billy'], ['2021-11-08', 'OnCall: Todd'], ['2021-11-09', 'OnCall: Todd'], ['2021-11-10', 'OnCall: Todd'], ['2021-11-11', 'OnCall: Todd'], ['2021-11-12', 'OnCall: Todd'], ['2021-11-13', 'OnCall: Todd'], ['2021-11-14', 'OnCall: Todd'], ['2021-11-15', 'OnCall: Moose'], ['2021-11-16', 'OnCall: Moose'], ['2021-11-17', 'OnCall: Moose'], ['2021-11-18', 'OnCall: Moose'], ['2021-11-19', 'OnCall: Moose'], ['2021-11-20', 'OnCall: Moose'], ['2021-11-21', 'OnCall: Moose'], ['2021-11-22', 'OnCall: DJ'], ['2021-11-23', 'OnCall: DJ'], ['2021-11-24', 'OnCall: DJ'], ['2021-11-25', 'OnCall: DJ'], ['2021-11-26', 'OnCall: DJ'], ['2021-11-27', 'OnCall: DJ'], ['2021-11-28', 'OnCall: DJ']]
 

Ответ №2:

Если я правильно понял вопрос, все так просто, как это:

 import datetime

start_date = datetime.date(2021, 11, 1)
end_date = datetime.date(2021, 11, 28)
onCall = ["Billy", "Todd", "Moose", "DJ", "Kach", "Darwin", "Freddy", "Todd"]
delta = datetime.timedelta(days=7)
for oc in onCall:
    print(f'{oc} is on call for week commencing {start_date}')
    if (start_date := start_date   delta) > end_date:
        break
 

Комментарии:

1. Спасибо вам за быстрые ответы и отзывы!!!