【发布时间】:2019-05-09 16:15:11
【问题描述】:
我需要合并区间对象以获得基于额外参数的不同区间范围。最好的方法是什么?
这是关于在给定时间状态是否为真的明确声明。返回的列表必须有不重复的区间。
区间对象说明:
{
'startDate': datetime.datetime, # start of interval
'endDate': datetime.datetime, # end of interval
'prioritized': bool # if True - it's always important, override no-prioritized intervals
'state': bool # result of interval
}
在下面的示例中,我将 startDate/endDate 更改为字符串以使它们看起来更好。
区间列表如下:
interval_list = [
{'startDate': '10:00:00', 'endDate': '12:00:00', 'prioritized': False, 'state': False},
{'startDate': '11:00:00', 'endDate': '18:00:00', 'prioritized': True, 'state': True},
{'startDate': '13:00:00', 'endDate': '17:00:00', 'prioritized': False, 'state': False},
{'startDate': '17:00:00', 'endDate': '20:00:00', 'prioritized': False, 'state': True},
{'startDate': '19:30:00', 'endDate': '19:45:00', 'prioritized': True, 'state': False}
]
我正在努力实现以下目标:
merge(interval_list) 应该返回:
[
{'startDate': '10:00:00', 'endDate': '11:00:00', 'state': False},
{'startDate': '11:00:00', 'endDate': '19:30:00', 'state': True},
{'startDate': '19:30:00', 'endDate': '19:45:00', 'state': False},
{'startDate': '19:45:00', 'endDate': '20:00:00', 'state': True},
]
我现在有以下未完成的代码:
def merge_range(ranges: list):
ranges = sorted(ranges, key=lambda x: x['startDate'])
last_interval = dict(ranges[0])
for current_interval in sorted(ranges, key=lambda x: x['startDate']):
if current_interval['startDate'] > last_interval['endDate']:
yield dict(last_interval)
last_interval['startDate'] = current_interval['startDate']
last_interval['endDate'] = current_interval['endDate']
last_interval['prioritized'] = current_interval['prioritized']
last_interval['state'] = current_interval['state']
else:
if current_interval['state'] == last_interval['state']:
last_interval['endDate'] = max(last_interval['endDate'], current_interval['endDate'])
else:
pass # i stopped here
yield dict(last_interval)
并通过merged_interval_list = list(merge_range(interval_list))使用它
这是一个好方法吗?
【问题讨论】:
-
这可能会给你一些想法:stackoverflow.com/q/44589798/476。要获得更具体的建议,了解这些间隔背后的概念背景以及合并应该准确完成的工作会很有帮助。
-
这是关于在给定小时状态下是否为真的明确声明。优先间隔覆盖非优先间隔。必须是没有重复的区间。
标签: python python-3.x