while 循环嵌套在另一个 while 循环中,不允许其他变量在 python 中递增

While loop nested in another while loop not allowing other variables to increment in python

我想做什么:

我们有一个日期范围。创建范围后,我将尝试“分配”一个人整整一周(通过将他们添加到特定日期的列表中)。然后,一旦该周完成,然后转到 onCall 列表中的下一个人,并为他们分配整整一周的待命时间,直到我们涵盖所有周数。

问题:

它将第一周分配给列表中的第一个人,但停止分配给列表中的下一个人。因此,在这种情况下,Billy 获得了分配给他的第一周,但是当他们应该分配给 Todd、Moose 和 DJ 时,其他 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)

我不是 100% 确定你想要实现什么。但我认为问题是你在嵌套的 while 循环中增加了变量 r。你应该在嵌套的 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']]

除非我误解了问题,否则就这么简单:

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