Python - 查找时间段

时间:2017-09-14 15:59:41

标签: python

我正在编写一个小型Python脚本,以根据日历约会查找时间可用的插槽。我能够在这里重复使用帖子上的代码:(Python - Algorithm find time slots)。

它似乎适用于预定约会一小时或更长时间,但对于那些不到一个小时的人似乎没有抓住它们。换句话说,即使预约约会(小于一个小时),它也会显示时间段可用。

下面提到的帖子中的示例代码,带有我自己的“小时”和“约会”值。

#get_timeslots.py

from datetime import datetime, timedelta

appointments = [(datetime.datetime(2017, 9, 7, 9, 30), 
               datetime.datetime(2017, 9, 7, 12, 30), 
               datetime.datetime(2017, 9, 7, 13, 30), 
               datetime.datetime(2017, 9, 7, 14, 0))]

hours = (datetime.datetime(2017, 9, 7, 6, 0), datetime.datetime(2017, 9, 7, 23, 0))


def get_slots(hours, appointments, duration=timedelta(hours=1)):
    slots = sorted([(hours[0], hours[0])] + appointments + [(hours[1], hours[1])])
    for start, end in ((slots[i][1], slots[i+1][0]) for i in range(len(slots)-1)):
        assert start <= end, "Cannot attend all appointments"
        while start + duration <= end:
            print "{:%H:%M} - {:%H:%M}".format(start, start + duration)
            start += duration

if __name__ == "__main__":
    get_slots(hours, appointments)

当我运行脚本时,我得到:

06:00 - 07:00
07:00 - 08:00
08:00 - 09:00
12:30 - 13:30
13:30 - 14:30
14:30 - 15:30
15:30 - 16:30
16:30 - 17:30
17:30 - 18:30
18:30 - 19:30
19:30 - 20:30
20:30 - 21:30
21:30 - 22:30

问题是,虽然9:30-12:30的第一次约会被阻止但没有出现在可用的时段中,但后来的13:30-2:00约会没有被阻止,因此显示为可用时隙输出。 (见“13:30 - 14:30”)。

我是一名Python新手并且承认我在没有完全理解它的情况下回收了代码。有人能指出我要改变什么,以便在不到一小时的时间内正确地阻止约会?

TIA,

-Chris

1 个答案:

答案 0 :(得分:1)

您错过了约会中的括号。试试这个:

#from datetime import datetime, timedelta
import datetime

#notice the additional brackets to keep the 2 slots as two separate lists. So, 930-1230 is one slot, 1330-1400 is an another.

appointments = [(datetime.datetime(2017, 9, 7, 9, 30), 
           datetime.datetime(2017, 9, 7, 12, 30)), 
           (datetime.datetime(2017, 9, 7, 13, 30), 
           datetime.datetime(2017, 9, 7, 14, 0))]