用于在两个特定日期之间存储和检索日期信息的结构

时间:2016-03-23 23:28:30

标签: python python-3.x

我有在特定日期发生的事件,例如:

[{'date_event': datetime.date(2001, 1, 1), 'event_name': 'event_1'},
 {'date_event': datetime.date(2001, 10, 1), 'event_name': 'event_2'}]

我正在寻找Python中的数据结构来存储这些信息,以便我可以轻松检索特定日期之间发生的事件。本质上,我希望能够查询数据结构并返回两个日期之间发生的事件。 e.g:

 def return_events_between_dates(start_date, end_date):
     ...
     return(list_of_events)

Python中是否有内置结构可以轻松实现这一点?如果已经有针对此类查询优化的内容,我不打算重新发明轮子。如果没有,列表理解是最好的方法吗?

1 个答案:

答案 0 :(得分:1)

不,没有简单的内置结构能够以优化的方式实现这一目标。

但是,标准库模块bisect提供了以比列表推导更优化的方式处理排序列表的功能。你可以用它来完成你的任务;它需要一点点工作和关心。

不幸的是,他们没有把关键功能作为一个参数,就像list.sort()那样。因此,要使用bisect函数,您需要将事件对象预处理为可比较的事物,并将主要根据日期进行比较。元组对此很好:

preprocessed_events = [(e['date_event'], e['event_name']) for e in events]
preprocessed_events.sort()

现在,您可以使用bisect_left()bisect_right()来获取所需事件开始和结束的排序列表的索引(假设您的端点都包含在内):

index_first = bisect.bisect_left(preprocessed_events, (start_date,))
index_last = bisect.bisect_right(preprocessed_events, (end_date,))

请注意,您必须将start_dateend_date转换为元组才能与排序列表中的元组进行比较。

了解开始和结束索引,您可以使用排序列表的切片获取所有事件的列表,如果需要将它们转换回您想要返回的任何形式。

请勿忘记检查切片索引以及bisect_left()bisect_right()的选择,以确保包含/排除要包含/排除的端点。特别是在您与start_dateend_date同日举办多项活动的情况下。