问题描述
[(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')]