Python — Алгоритм поиска временных интервалов

Допустим, сегодня я работаю с 09:00 до 18:00, у меня 3 встречи:

  • 10:00 - 10:30
  • 12:00 - 13:00
  • 15:30 - 17:10

Мне нужно найти список доступных временных интервалов по 1 часу в день.
Вот список, который я должен получить

  • 09:00 - 10:00
  • 10:30 - 11:30
  • 13:00 - 14:00
  • 14:00 - 15:00

Я уже реализовал это на php и просто попытался поместить в python.
Вот моя попытка:

def get_slots(areas, duration):
    slots = []
    for area in areas:
        if area['start'] == area['end']:
            continue
        i = area['start']
        while (i + duration) <= area['end']:
            i += duration
            slots.append({
                'start': (i - duration),
                'end': i,
            })
    return slots

def get_areas(day_start, day_end, appts):
    areas = []
    old_end = day_start
    for appt in appts:
        if appt['start'] > old_end:
            areas.append({
                'start': old_end,
                'end': appt['start'],
            })
        old_end = appt['end']
        if old_end > day_end:
            return areas
    areas.append({
        'start': old_end,
        'end': day_end,
    })
    return areas

Тест:

>>> day_start = datetime.datetime(2012, 5, 22, 9)
>>> day_end = datetime.datetime(2012, 5, 22, 18)
>>> appts = [{
    'start': datetime.datetime(2012, 5, 22, 10),
    'end': datetime.datetime(2012, 5, 22, 10, 30),
  },{
    'start': datetime.datetime(2012, 5, 22, 12),
    'end': datetime.datetime(2012, 5, 22, 13),
  },{
    'start': datetime.datetime(2012, 5, 22, 15, 30),
    'end': datetime.datetime(2012, 5, 22, 17, 10),
  },]
>>> duration = datetime.timedelta(hours=1)
>>> pprint.pprint(get_slots(get_areas(day_start, day_end, appts), duration))

Работает, но я просто портировал код из php.
Поэтому я не уверен, что это питонистский способ сделать это.

Можете ли вы показать мне, что я могу улучшить?

8
задан Pierre de LESPINAY 22 May 2012 в 12:40
поделиться