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
我想做什么:
我们有一个日期范围。创建范围后,我将尝试“分配”一个人整整一周(通过将他们添加到特定日期的列表中)。然后,一旦该周完成,然后转到 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