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
Демо-версия:
>>> 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)
sidenote: Мне кажется, что морально / прагматически неправильно считать, что, по моему личному мнению, периоды больничных дней, граничащих с выходными, потенциально могут быть на 2-4 дня дольше. Но если у вас есть веская причина для этого, кто я такой, чтобы судить. =) Чтобы подсчитать их, постобработайте свои прогоны: добавьте 2, если первым днем был понедельник, и добавьте 2, если последним днем была пятница, затем добавьте len(d for d in range(run[-1]-run[0]) if (run[0]+d*day).isWeekend())
. Конечно, это не учитывает праздничные дни, и в этом случае вы должны сделать .isHoliday() or .isWeekend()
и сделать логику «добавить 2» точно такой же, как логика len(...)
, повторяя итерацию до тех пор, пока не найдете нерабочий день, и оштрафовать человека за каждый таким образом, к выходным или выходным, прилегающим к трассе.