查找列表中的所有非重叠间隔

时间:2020-07-19 20:51:11

标签: python-3.x list

我有一个嵌套列表(已使用键作为开始元素进行排序)定义为;

L=[[0,3],[1,2],[4,5],[6]]

目标是获取所有不重叠子间隔的元组。因此输出应该看起来像;

[([0,3],[4,5],[6]),([1,2],[4,5],[6])]

我可以使用以下代码对连续的元素进行成对比较;

overlap=False
Lnew=[]
for i in range(len(L)-1):
   overlap=False
   if L[i+1][0]<L[i][1]:
      overlap=True
   if overlap==False:
       Lnew.append((L[i],L[i+1]))

这个想法给了我以下输出;

[([1, 2], [4, 5]), ([4, 5], [6])]

如图所示,它每次给我一对,这与所需的输出不同。我可以获取有关如何修改逻辑以获得所需输出的帮助吗?请注意,它需要在线性时间内完成。那将真的很有帮助。谢谢。

1 个答案:

答案 0 :(得分:1)

这里的递归思想是,只要您发现重叠的间隔,便有了新的起点。那就是递归的本质。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

在这里,停顿点已经到手,并且已经解决了所有子问题。

# recursive non-overlapping interval finder
data = [[0,3],[1,2],[4,5],[6]]
data2 = [[0,5],[4,8],[7,15]]


def search( x: list,
            result: list) -> list:
    # stopping condition #1 ... last element was overlapped and is a singleton
    if len(x) == 1:
        result.append(tuple([x[0]]))
        return result
    temp = [x[0]]  # to hold intermediate result, starting with first input element
    for idx, element in enumerate(x[1:], 1):
        if element[0] >= temp[-1][1]:
            temp.append(element)
        else:  # found a new starting point
            search(x[idx:], result)
    result.append(tuple(temp))
    return(result)

print(f'\nsearching {data}')
res = search(data, [])
for t in res:
    print(t)

print(f'\nsearching {data2}')
res = search(data2, [])
for t in res:
    print(t)

输出

searching [[0, 3], [1, 2], [4, 5], [6]]
([1, 2], [4, 5], [6])
([0, 3], [4, 5], [6])

searching [[0, 5], [4, 8], [7, 15]]
([7, 15],)
([4, 8],)
([0, 5], [7, 15])
[Finished in 0.0s]
相关问题