3 回答
TA贡献1891条经验 获得超3个赞
我改变了主意(和回答),现在认为您应该定义自己的数据结构来保存字典中的时间。有了它,您可以轻松地将结束时间调整为相对于初始时间的同一天。
在下面的代码中, range_list 中的值与您的问题中显示的值相同,因此可以通过根据需要更改结束时间来进行调整。
调整后,range_list包含:
[{'init': Timestamp(10, 0, 0), 'end': Timestamp(12, 0, 0)}
{'init': Timestamp(11, 0, 0), 'end': Timestamp(12,30, 0)}
{'init': Timestamp(22, 0, 0), 'end': Timestamp(28,30, 0)}
{'init': Timestamp(23, 0, 0), 'end': Timestamp(24,30, 0)}]
由于您控制输入数据,因此最好以所需的格式创建它们。
from collections import namedtuple
from pprint import pprint, pformat
class Timestamp(namedtuple('Timestamp', 'h,m,s')):
def __repr__(self):
classname = self.__class__.__name__
return '{}({:2},{:2},{:2})'.format(classname, self.h, self.m, self.s)
range_list = [{'init': Timestamp(10,0,0), 'end': Timestamp(12,0,0)},
{'init': Timestamp(11,0,0), 'end': Timestamp(12,30,0)},
{'init': Timestamp(22,0,0), 'end': Timestamp(4,30,0)},
{'init': Timestamp(23,0,0), 'end': Timestamp(0,30,0)}]
# Adjust end times.
for i, interval in enumerate(range_list):
init, end = interval['init'], interval['end']
range_list[i] = {'init': init,
'end' : Timestamp(end.h+24 if end.h < init.h else end.h,
end.m, end.s)}
def merge(intervals):
merged = []
x, y = intervals[0]['init'], intervals[0]['end']
for interval in intervals:
if interval['init'] <= y:
if interval['end'] > y:
y = interval['end']
else:
merged.append({'init': x, 'end': y})
x = interval['init']
y = interval['end']
merged.append({'init': x, 'end': y})
return merged
print(merge(range_list))
输出:
[{'init': Timestamp(10, 0, 0), 'end': Timestamp(12,30, 0)},
{'init': Timestamp(22, 0, 0), 'end': Timestamp(28,30, 0)}]
添加回答
举报