Python嵌套while循环变量无法递增导致onCall轮值排班分配异常
问题根因
代码的核心错误是r变量的增量逻辑放错了位置:你把r = 1 + r写在了内层逐天赋值的循环里,每处理1天就给r加1,第一周7天处理完r就变成了7,而你设置的总周数weeks = 28/7 =4,此时外层循环的判断条件r < weeks直接不成立,外层循环只执行1次就退出了,自然只有第一周的Billy被分配,后续人员都没触发分配逻辑。
修复方案
把r的增量从内层循环移到外层循环,每处理完整一周再给r加1即可,修复后的完整代码如下:
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) 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: Days[daysi].append(personOnCall) weekdaycounter = weekdaycounter + 1 daysi = 1 + daysi personcounter = 1 + personcounter weekdaycounter = 0 r = r + 1 # 增量移到此处,处理完一整周再计数+1 if (personcounter == lengthOfonCall): personcounter = 0 print(Days)
可选优化点
- 可以直接用
datetime的isoweekday()方法判断周边界,不用手动计数天/周,适配非整周的日期范围场景 - 人员轮询可以直接用
itertools.cycle简化代码,不用手动维护personcounter的重置逻辑
内容的提问来源于stack exchange,提问作者gillunderwater
相关产品推荐
相关产品推荐

