У меня есть куча временных интервалов с началом и концом типа datetime. Учитывая конкретную дату и время, мне нужно получить те, которые были до и после:
def get_before(timeslots, moment):
return [t for t in timeslots if t.end <= moment]
def get_after(timeslots, moment):
return [t for t in timeslots if t.start >= moment]
Но есть два необязательных аргумента, минимальный и максимальный, указывающие, что временные интервалы должны быть в пределах максимального количества минут и вне минимума.
У нас есть следующие слоты:
2018-06-27 09:00:00 - 2018-06-27 10:00:00
2018-06-27 10:00:00 - 2018-06-27 11:00:00
2018-06-27 11:00:00 - 2018-06-27 12:00:00
2018-06-27 12:00:00 - 2018-06-27 13:00:00
2018-06-27 13:00:00 - 2018-06-27 14:00:00
2018-06-27 14:00:00 - 2018-06-27 15:00:00
2018-06-27 15:00:00 - 2018-06-27 16:00:00
2018-06-27 16:00:00 - 2018-06-27 17:00:00
2018-06-27 17:00:00 - 2018-06-27 18:00:00
2018-06-27 18:00:00 - 2018-06-27 19:00:00
2018-06-27 19:00:00 - 2018-06-27 20:00:00
2018-06-27 20:00:00 - 2018-06-27 21:00:00
2018-06-27 21:00:00 - 2018-06-27 22:00:00
Если нам нужны временные интервалы после 2018-06-27 15:00:00
, с минимумом 1 час и максимум 4 часа, мы получаем:
2018-06-27 16:00:00 - 2018-06-27 17:00:00
2018-06-27 17:00:00 - 2018-06-27 18:00:00
2018-06-27 18:00:00 - 2018-06-27 19:00:00
2018-06-27 19:00:00 - 2018-06-27 20:00:00
Это моя реализация:
def get_before(timeslots, moment, minimum=None, maximum=None):
tslots = [t for t in timeslots if t.end <= moment]
if maximum is not None:
maxdelta = datetime.timedelta(minutes=maximum)
tslots = [t for t in tslots if t.end + maxdelta >= moment]
if minimum is not None:
mindelta = datetime.timedelta(minutes=minimum)
tslots = [t for t in tslots if t.end <= moment - mindelta]
return tslots
def get_after(timeslots, moment, minimum=None, maximum=None):
tslots = [t for t in timeslots if t.start >= moment]
if maximum is not None:
maxdelta = datetime.timedelta(minutes=maximum)
tslots = [t for t in tslots if t.start - maxdelta <= moment]
if minimum is not None:
mindelta = datetime.timedelta(minutes=minimum)
tslots = [t for t in tslots if t.start >= moment + mindelta]
return tslots
Проблема в том, что для каждой функции фильтрации я повторяю список timeslots
три раза: один, чтобы получить их до или после момента, во-вторых, чтобы получить их в пределах максимального временного диапазона, и в-третьих, чтобы отфильтровать те, которые находятся вне минимальный диапазон времени.
Эти функции будут вызываться очень часто, поэтому мне интересно, есть ли способ объединить фильтрацию, чтобы список повторялся только один раз.