#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. Спасибо вам за быстрые ответы и отзывы!!!