我已经列出了如下的字典格式
[{'end': '19:00', 'start': '10:00'}, {'end': '23:00', 'start': '12:15'}, {'end': '12:00', 'start': '09:15'}]
并想要检查时间间隔是否重叠
我打算做什么:
- 首先要根据开始值对字典列表进行排序
- 第二项起始值与第一项结束值比较
所以,我现在的方法是:
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'))
我走对了吗?
这似乎取决于您的输入含义。如果每个元素都是它自身的时间间隔(对于每个元素,时间间隔从它的开始值开始,到它的结束值结束),您首先需要:
- 根据起始值对字典列表进行排序。
- 比较每个物品的起始值与前一个物品的结束值。如果元素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
改进代码的一种可能方法是在第一次创建插槽时将start
和end
转换为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))