Union of multiple ranges

后端 未结 5 615
悲&欢浪女
悲&欢浪女 2020-11-27 07:28

I have these ranges:

7,10
11,13
11,15
14,20
23,39

I need to perform a union of the overlapping ranges to give ranges that are not overlappi

5条回答
  •  青春惊慌失措
    2020-11-27 07:58

    Let's say, (7, 10) and (11, 13) result into (7, 13):

    a = [(7, 10), (11, 13), (11, 15), (14, 20), (23, 39)]
    b = []
    for begin,end in sorted(a):
        if b and b[-1][1] >= begin - 1:
            b[-1] = (b[-1][0], end)
        else:
            b.append((begin, end))
    

    b is now

    [(7, 20), (23, 39)]
    

    EDIT:

    As @CentAu correctly notices, [(2,4), (1,6)] would return (1,4) instead of (1,6). Here is the new version with correct handling of this case:

    a = [(7, 10), (11, 13), (11, 15), (14, 20), (23, 39)]
    b = []
    for begin,end in sorted(a):
        if b and b[-1][1] >= begin - 1:
            b[-1][1] = max(b[-1][1], end)
        else:
            b.append([begin, end])
    

提交回复
热议问题