Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
&引用;“合并”;python中的时间范围_Python_Datetime - Fatal编程技术网

&引用;“合并”;python中的时间范围

&引用;“合并”;python中的时间范围,python,datetime,Python,Datetime,我有一堆打开/关闭时间的“规则”,我希望合并这些规则,以获得当天的一组统一规则 from datetime import time times = [ {"time_open": time(9, 0), "time_close": time(11, 0)}, {"time_open": time(9, 0), "time_close": time(12, 0)}, {"time_open": time(13, 0), "time_close": time(18, 0)}

我有一堆打开/关闭时间的“规则”,我希望合并这些规则,以获得当天的一组统一规则

from datetime import time

times = [
    {"time_open": time(9, 0), "time_close": time(11, 0)},
    {"time_open": time(9, 0), "time_close": time(12, 0)},
    {"time_open": time(13, 0), "time_close": time(18, 0)},
    {"time_open": time(15, 0), "time_close": time(19, 0)},
]

# something would produce

merged_times = [
    {"time_open": time(9, 0), "time_close": time(12, 0)},
    {"time_open": time(13, 0), "time_close": time(19, 0)},
]

我脑子里有几种方法,但速度可能是选择方法的主要驱动力

您需要从一组已排序的时间间隔开始;如果尚未排序,请从以下内容开始:

from operator import itemgetter

sorted_times = sorted(times, key=itemgetter('time_open', 'time_close'))
然后,您可以通过比较开始时间和之前的结束时间来合并时间;当他们没有超过圈数时,产生更新的时间:

def merge_times(times):
    times = iter(times)
    merged = next(times).copy()
    for entry in times:
        start, end = entry['time_open'], entry['time_close']
        if start <= merged['time_close']:
            # overlapping, merge
            merged['time_close'] = max(merged['time_close'], end)
        else:
            # distinct; yield merged and start a new copy
            yield merged
            merged = entry.copy()
    yield merged

您需要从一组已排序的时间间隔开始;如果尚未排序,请从以下内容开始:

from operator import itemgetter

sorted_times = sorted(times, key=itemgetter('time_open', 'time_close'))
然后,您可以通过比较开始时间和之前的结束时间来合并时间;当他们没有超过圈数时,产生更新的时间:

def merge_times(times):
    times = iter(times)
    merged = next(times).copy()
    for entry in times:
        start, end = entry['time_open'], entry['time_close']
        if start <= merged['time_close']:
            # overlapping, merge
            merged['time_close'] = max(merged['time_close'], end)
        else:
            # distinct; yield merged and start a new copy
            yield merged
            merged = entry.copy()
    yield merged

合并规则的标准是什么?为什么从输出中删除最后一项?您的输入是否按开始和结束时间排序?@VanPeer:因为时间与之前的开始时间重叠。请注意,时间已合并;13:00-18:00和15:00-19:00的开始时间已合并为13:00-19:00的单一跨度。合并规则的标准是什么?为什么从输出中删除最后一项?您的输入是否按开始和结束时间排序?@VanPeer:因为时间与之前的开始时间重叠。请注意,时间已合并;13:00-18:00和15:00-19:00的开放时间已合并为13:00-19:00的单一跨度相关:。