Pull to refresh

Интервально-ассоциативный массив

Python *
Замечательная вещь — ассоциативный массив. Самые разные задачи решаются с его помощью легко, приятно и быстро. А как быть когда значение должно принадлежать не одному ключу, а быть «размазанным» на некоторый интервал?
Представьте, что вам нужно сделать программу для составления расписания дежурства менеджеров интернет-магазина. Работа с ним должна была максимально простой, примерно так:
# легко назначить
>>> timetable['08:00' : '12:00'] = 'Иванов'
>>> timetable['12:00' : '16:00'] = 'Петров'

# как узнать кто дежурил в 13:51 ?
>>> print timetable['13:51']
Петров

# легко просмотреть поэлементо полный список
>>> for interval, person in timetable.items(): print interval, person
('08:00', '12:00') Иванов
('12:00', '16:00') Петров

# ...или одной строкой
>>> print timetable
{['08:00', '12:00'] => 'Иванов', ['12:00', '16:00'] => 'Петров'}



# удаление как по частям
>>> del timetable['15:00' : '16:00']
>>> print timetable
{['08:00', '12:00'] => 'Иванов', ['12:00', '15:00'] => 'Петров'}

# ...так и целиком
>>> del timetable['12:00' : '16:00']
>>> print timetable
{['08:00', '12:00'] => 'Иванов'}

# перекрывание ключей должно обрабатываться корректно
>>> timetable['11:00' : '15:00'] = 'Сидоров'
>>> print timetable
{['08:00', '11:00'] => 'Иванов', ['11:00', '15:00'] => 'Сидоров'}

# соседние ключи с одинаковыми значениями должны склеиваться автоматически,
# например, если вы назначили Сидорову подежурить так же с 15 до 17,
# то наврядли это должно быть две смены подряд, скорее одна более длинная
>>> timetable['15:00' : '17:00'] = 'Сидоров'
>>> print timetable
{['08:00', '11:00'] => 'Иванов', ['11:00', '17:00'] => 'Сидоров'}

# добавим пару записей
>>> timetable['17:00' : '20:00'] = 'Петров'
>>> timetable['21:00' : '23:00'] = 'Сидоров'
>>> timetable
{['08:00', '11:00'] => 'Иванов', ['11:00', '17:00'] => 'Сидоров',
['17:00', '20:00'] => 'Петров', ['21:00', '23:00'] => 'Сидоров'}

# часто возникает задача урезать расписание, оставив из нескольких идущих подряд элементов,
# только последние. Например, нужно узнать кто закрывал рабочий день.
>>> timetable.shrink()
>>> print timetable
{['08:00', '20:00'] => 'Петров', ['21:00', '23:00'] => 'Сидоров'}


# этот же метод можно использовать для проверки
# полностью ли ваше расписание охватывает рабочий день.


Примерно такая задача встала передо мной в проекте. Гугление дало один интересный рецепт, в котором отсутствовало несколько важных фич. После доработки напильником все встало на свои места.

Кому нужно — смело берите. Любые комметарии, вопросы, багрепорты приветствуются. Если есть идеи по развитию — пишите!

UPD: К сожалению, после Visual Code Highlighter-a и Хабрапарсера, форматирование кода основательно испортилось, поэтому я его убираю отсюда и выкладываю на гугль: code.google.com/p/intervalmap/source/browse/trunk/intervalmap.py
Tags: pythonintervalintervalmapхешинтервалинтервальный хеш
Hubs: Python
Total votes 103: ↑96 and ↓7 +89
Comments 80
Comments Comments 80

Popular right now

Top of the last 24 hours