如何在python中分离一些重叠的时间段?

问题描述

我有一个不同时间段的列表,从开始到结束,例如:

[(0,50),(40,70),(60,100),(65,105),(90,120),(110,150) ]

我需要以某种方式找到重叠的时间范围,并将这些时间段分配到不同的层,其中每一层都没有重叠,例如,上面的结果应该是:

[(0,50,'layer 1'),100,150,70,'layer 2'),120,105,'layer 3')]

现在,我在开始时间/结束时间添加了“ +” /“-”符号,然后对其进行了排序。我坚持下一步。

解决方法

另一种解决方案,使用defaultdict

from collections import defaultdict


def find_layer(start,end,layers):
    l = 0
    while layers[l] > start:
        l += 1
    layers[l] = end
    return l

lst = [(0,50),(40,70),(60,100),(65,105),(90,120),(110,150)]

# assuming lst is already sorted
# lst = sorted(lst)
layers = defaultdict(int)

for start,end in lst:
    print(start,'layer_{}'.format(find_layer(start,layers) + 1))

打印:

0 50 layer_1
40 70 layer_2
60 100 layer_1
65 105 layer_3
90 120 layer_2
110 150 layer_1
,

一种方法是创建一个包含不同图层的列表,并用您的元组填充它,并在需要时动态创建一个新图层。

# sort the data if it is not already in the order we need
data = sorted(data,key=lambda x: x[1])
data = sorted(data,key=lambda x: x[0])

# build layers as a list of lists
# the outer list will contain the layer levels
# the inner list will contain the periods/tuples in each layer
layers = [[data[0] + ('layer 1',)]] # initialize layer 1
for period in data[1:]: # get one period at a time and find which layer is a good fit
    for lay,temp in enumerate(layers):
        if period[0] > temp[-1][1]:
            # period starts after current layer's last period's end
            # add third element to tuple and append to layer
            temp.append(period + (f'layer {lay + 1}',))
            break
    else:
        # did not find a layer that can hold current period,create a new layer
        layers.append([period + (f'layer {len(layers) + 1}',)])

# flatten layers
layers = [e for L in layers for e in L]

输出

[(0,50,'layer 1'),100,150,70,'layer 2'),120,105,'layer 3')]