2017-09-02 84 views
1

我有個時隙(日期,結束日期),由開始日期排序名單如下:比較蟒蛇時隙

slots = [(datetime.datetime(2017, 10, 2, 6, 0), datetime.datetime(2017, 10, 2, 17, 40)), 
(datetime.datetime(2017, 10, 2, 10, 35), datetime.datetime(2017, 10, 2, 16, 25)), 
(datetime.datetime(2017, 10, 2, 11, 0), datetime.datetime(2017, 10, 2, 12, 0)), 
(datetime.datetime(2017, 10, 2, 12, 0), datetime.datetime(2017, 10, 2, 13, 0)), 
(datetime.datetime(2017, 10, 2, 15, 0), datetime.datetime(2017, 10, 2, 16, 0)), 
(datetime.datetime(2017, 10, 2, 18, 0), datetime.datetime(2017, 10, 2, 19, 0))] 

我想刪除所有時隙與包括開始日期和結束日期在另一個時間段呈現這個列表。

所以在這裏,例如,最終的結果應該是:

slots = [(datetime.datetime(2017, 10, 2, 6, 0), datetime.datetime(2017, 10, 2, 17, 40)), 
(datetime.datetime(2017, 10, 2, 18, 0), datetime.datetime(2017, 10, 2, 19, 0))] 

我試圖用下面的函數來減少它,但它不工作:

reduce(slots_removal, slots) 

def slots_removal(a, b): 
    if a[1] > b[1]: 
     del b 

這將產生:

TypeError: 'NoneType' object has no attribute '__getitem__'" 
+0

您的輸入是否總是排序?部分重疊怎麼樣(開始在前一個結束之前,但結束在之後)? –

+0

嗨@MartijnPieters,是的,我排序輸入,以便更容易過濾使用'slots = sorted(current_schedule,key = lambda x:x [0])' 所以開始可以在前一個條目和結束之前之後,但它不應該影響結果,不是嗎? – chdecultot

回答

1

如果您的輸入始終排序,那麼您可以使用生成器函數:

import datetime 

def reduced(timeseries): 
    prev = datetime.datetime.min 
    for start, end in timeseries: 
     if end > prev: 
      prev = end 
      yield start, end 

這隻產量(start, end)元組,如果end晚於previousy產生的元組。

演示:

>>> list(reduced(slots)) 
[(datetime.datetime(2017, 10, 2, 6, 0), datetime.datetime(2017, 10, 2, 17, 40)), (datetime.datetime(2017, 10, 2, 18, 0), datetime.datetime(2017, 10, 2, 19, 0))] 
>>> from pprint import pprint 
>>> pprint(_) 
[(datetime.datetime(2017, 10, 2, 6, 0), 
    datetime.datetime(2017, 10, 2, 17, 40)), 
(datetime.datetime(2017, 10, 2, 18, 0), 
    datetime.datetime(2017, 10, 2, 19, 0))] 

不能使用reduce();該函數根據輸入序列生成單個結果。函數的輸出成爲下一次調用的輸入(連同下一個元素);因爲你的函數不會顯式返回任何東西,所以返回None,並用作下一次調用的輸入。

+0

非常感謝,它效果很棒!並感謝關於reduce()函數的解釋! – chdecultot