gpt4 book ai didi

Python - 算法查找时隙

转载 作者:太空狗 更新时间:2023-10-29 20:54:40 25 4
gpt4 key购买 nike

假设今天我从 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 移植了代码。
所以我不确定这是不是一种 pythonist 的方式。

你能告诉我哪里可以改进吗?

最佳答案

#time_slots.py
from datetime import datetime, timedelta

appointments = [(datetime(2012, 5, 22, 10), datetime(2012, 5, 22, 10, 30)),
(datetime(2012, 5, 22, 12), datetime(2012, 5, 22, 13)),
(datetime(2012, 5, 22, 15, 30), datetime(2012, 5, 22, 17, 10))]

hours = (datetime(2012, 5, 22, 9), datetime(2012, 5, 22, 18))

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)


% python time_slots.py
09:00 - 10:00
10:30 - 11:30
13:00 - 14:00
14:00 - 15:00

关于Python - 算法查找时隙,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10702224/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com