假设我有两个句点,它们是日期,但是为了简单起见,这里是整数:
ID START END VALUE
A 3 5 2
B 1 7 1
如何获取两个开始和结束时间段的交点以及这两个时间段的相交部分,返回如下内容:
{ 'inner': [3, 5],
'outer': [[1, 2], [6, 7]] }
我的第一个想法是将其分解为所有日期可能性的集合,并通过简单地在每个日期上进行标记来显示哪些部分在输入和输出。但是,那将花费惊人的时间。
我想到的第二种方法是生成两个范围内每个日期的列表,并检查邮票是否匹配,然后以某种方式将其缩小到周期范围内……但这似乎效率极低。 / p>
在标准库中是否有某种方法可以做到这一点?还是熊猫图书馆?
答案 0 :(得分:0)
我还没有找到具有有效解决方案的类似名称的问题。为避免出现Xkcd“您看到了什么”的情况,我将其发布。
我最终手工开发了一个算法。我对这是最好的方法没有信心。
def range_intersection(set1, set2):
end1_og = set1[1]
set1[1] = set2[0] - 1
set3 = [set2[1] + 1, end1_og]
if set2[0] < set1[0]:
# if 2 is older than 1's start, peg start 2 to start 1
set2[0] = set1[0]
new_sets = []
if not set3[1] < set3[0]:
new_sets.append(set3)
if not set1[1] < set1[0]:
new_sets.append(set1)
return [set2, new_sets]
但是,它确实为测试(以及我也测试过的其他一些答案)提供了正确答案:
>>> range_intersection([3, 5], [1, 7])
[[3, 5], [[6, 7], [1, 2]]]