亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在python中分離一些重疊的時間段?

如何在python中分離一些重疊的時間段?

絕地無雙 2023-07-11 14:33:50
我有一個不同時間段的列表,開始和結束,比方說:[(0, 50), (40, 70), (60,100), (65, 105), (90, 120), (110, 150) ]我需要以某種方式找到重疊的時間范圍并將這些時間段分配到不同的層中,其中每個層中沒有重疊,例如上面的列表結果應該是:[(0, 50, 'layer 1'), (60,100, 'layer 1'), (110,150, 'layer 1'),  (40,70, 'layer 2'), (90,120, 'layer 2'),  (65,105, 'layer 3')]現在我已經在開始時間/結束時間中添加了“+”/“-”符號,然后對它們進行排序。我堅持下一步。
查看完整描述

2 回答

?
www說

TA貢獻1775條經驗 獲得超8個贊

另一種解決方案,使用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, end, 'layer_{}'.format(find_layer(start, end, 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


查看完整回答
反對 回復 2023-07-11
?
慕尼黑8549860

TA貢獻1818條經驗 獲得超11個贊

一種方法是創建一個列表來包含不同的層,并用元組填充它,在需要時動態創建新層。


# 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'), (60, 100, 'layer 1'), (110, 150, 'layer 1'), (40, 70, 'layer 2'), (90, 120, 'layer 2'), (65, 105, 'layer 3')]



查看完整回答
反對 回復 2023-07-11
  • 2 回答
  • 0 關注
  • 149 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號