我需要合并间隔对象,以获得基于额外参数的不同间隔范围。最好的方法是什么?你知道吗
它是关于在给定的时间内状态是否为真的明确声明。返回的列表必须具有不重复的间隔。你知道吗
间隔对象描述:
{
'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))
使用它
这样好吗?你知道吗
当我们处理时间间隔时,主要思想是对日期(开始和结束)及其状态进行排序:
start
或end
。在这里,我们也需要访问原始间隔,以处理优先级和状态。你知道吗让我们试试这个列表:
首先,我们将日期字符串转换为日期(就像您所做的那样):
现在,我们用需要的信息建立一个新的列表:
L
是以下元组列表(date, dir, index)
(dir
:1表示开始日期,-1表示结束日期):现在我们可以迭代
L
并跟踪当前状态和优先级,以便在根据给定优先级修改状态时生成日期:T
的值是:然后,您可以轻松地生成所需的输出。希望有帮助!你知道吗
编辑:奖励:如何将开始日期转换为时间间隔:
你只需要把每一个开始日期和下一个日期压缩一下就可以得到间隔。你知道吗
我得到了这个问题的答案:
首先,我将事件分为优先级列表和非优先级列表。你知道吗
基于优先级列表,我在给定的一天创建一个时间间隔的否定。你知道吗
接下来,我将优先列表设置为主列表,并开始迭代非优先列表。你知道吗
现在排序列表:
退货:
相关问题 更多 >
编程相关推荐