Python检查字典列表中的日期时间重叠



我已经列出了如下的字典格式

[{'end': '19:00', 'start': '10:00'}, {'end': '23:00', 'start': '12:15'}, {'end': '12:00', 'start': '09:15'}]

并想要检查时间间隔是否重叠

我打算做什么:

  1. 首先要根据开始值对字典列表进行排序
  2. 第二项起始值与第一项结束值比较

所以,我现在的方法是:

for elem,next_elem in zip(sorted_slot, sorted_slot[1:]):
print(datetime.strptime(elem['end'], '%H:%M') > datetime.strptime(next_elem['start'], '%H:%M'))

我走对了吗?

这似乎取决于您的输入含义。如果每个元素都是它自身的时间间隔(对于每个元素,时间间隔从它的开始值开始,到它的结束值结束),您首先需要:

  1. 根据起始值对字典列表进行排序。
  2. 比较每个物品的起始值与前一个物品的结束值。如果元素x的起始值小于元素x-1的结束值,则存在重叠。

否则,如果你的值像链一样排序(每个时间间隔从元素x的开始值开始,到元素x+1的结束值结束),我认为对你来说,像第一部分那样先排序,然后通过算法检查重叠会容易得多。

祝你好运!

您需要将字符串转换为时间,并使条件

import datetime
def checkTime(newTime):
newTimeObj=datetime.datetime.strptime(newTime, '%H:%M').time()
lst=[{'end': '19:00', 'start': '10:00'}, {'end': '23:00', 'start': '12:15'}, {'end': '12:00', 'start': '09:15'}]
x=0
for i in lst:
timeStart=datetime.datetime.strptime(i["start"], '%H:%M').time()
print(timeStart)
timeEnd=datetime.datetime.strptime(i["end"], '%H:%M').time()
if newTimeObj>timeStart and newTimeObj<timeEnd:
return True,x
x+=1
return False,-1
exist,index=checkTime("23:30")
print(exist)
print(index)
print("--")
exist,index=checkTime("20:30")
print(exist)
print(index)
10:00:00
12:15:00
09:15:00
False
-1
--
10:00:00
12:15:00
True
1

改进代码的一种可能方法是在第一次创建插槽时将startend转换为datetime对象,而不是每次调用检查时都这样做。之后,您可以根据start日期对槽进行排序。

def check_overlap(slots):
for slot in slots:
slot['start'] = datetime.datetime.strptime(slot['start'], '%H:%M')
slot['end'] = datetime.datetime.strptime(slot['end'], '%H:%M')
slots = sorted(slots, key=lambda x: x['start'])
return any(elem['end'] > next_elem['start']
for elem, next_elem in zip(slots, slots[1:]))
slots = [{'end': '19:00', 'start': '10:00'}, {'end': '23:00', 'start': '12:15'}, {'end': '12:00', 'start': '09:15'}]
print(check_overlap(slots))

相关内容

  • 没有找到相关文章

最新更新