我有一个datetime列表。时间如下。这个列表的最大长度总是<=4。的日期。时间值显示开始和结束时间范围。我试图在Python中找到一种有效的方法来返回一个包含重叠时间的单个元素的列表。例如,在这种情况下,函数应该返回[datetime]。Time (1,30), datetime。时间(30)]。只有当结束时间相同时才考虑重叠。
times = [[datetime.time(15, 30), datetime.time(17, 0)], [datetime.time(23, 0), datetime.time(5, 30)], [datetime.time(1, 30), datetime.time(5, 30)]]
您必须按结束时间对时间跨度进行分组,当同一组中有多个时间跨度时,获取最短的时间并将其添加到结果中。
有几种方法可以做到这一点,并且有几个模块可以帮助实现这一点。
有一种方法:
from datetime import time
from collections import defaultdict
from functools import reduce, partial
def nearest(end, a, b):
return min(a, b) if (a < end) != (b < end) else max(a, b)
def shortest_suffix(times):
d = defaultdict(list)
for start, end in times:
d[end].append(start)
return [
[reduce(partial(nearest, end), starts), end]
for end, starts in d.items()
if len(starts) > 1
]
# demo run
times = [[time(15, 30), time(17, 0)],
[time(23, 0), time(5, 30)],
[time(1, 30), time(5, 30)]]
print(shortest_suffix(times)) # [[datetime.time(1, 30), datetime.time(5, 30)]]