我有以下时间列表(start_date,end_date),按开始日期排序:
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 :(得分: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
个元组。
演示:
>>> 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
而是用作下一次调用的输入。