def group(iterable):
myIter = iter(iterable)
run = [next(myIter)]
def continuesRun(x):
return run[-1]==x-1
for x in myIter:
if continuesRun(x):
run.append(x)
else:
yield run
run = [x]
yield run
Demo:
>>> list( group([1,10,11,12,20,21]) )
[[1], [10, 11, 12], [20, 21]]
要将其应用到您的情况,请定义函数continuesRun
像这样,用伪代码:
def continuesRun(date):
previousDate = run[-1]
return previousDate==date-1day or (previousDate.weekday==Friday and previousDate==date-3day)
旁注:在我个人看来,将周末附近的病假时间计算为可能会多出 2 或 4 天,这在道德/务实上似乎有点错误。但如果你有充分的理由这样做,我又有什么资格去评判呢? =) 要计算这些,请对您的跑步进行后处理:如果第一天是星期一,则添加 2;如果最后一天是星期五,则添加 2,然后添加len(d for d in range(run[-1]-run[0]) if (run[0]+d*day).isWeekend())
。当然这不包括假期,在这种情况下你会这样做.isHoliday() or .isWeekend()
并使“add 2”逻辑与len(...)
逻辑,通过迭代直到找到非假期,并在与跑步相邻的每个假期或周末惩罚该人。