如何在Python中合并重叠间隔

时间:2019-07-06 13:53:14

标签: python list tuples

它应该是一个简化信息输出的功能。 例如,输入是一个元组列表[(2, 7), (7, 8)],那么输出应该是[(2, 8)]

我已经尝试解决此任务,但是有一个错误,或者我解决这个问题的方法不正确

def func(array):
    temparray = []
    for i in range(len(array) - 1):
        if math.fabs(array[i + 1][0] - array[i][1]) == 0 or math.fabs(array[i + 1][0] - array[i][1]) == 1:
            if array[i + 1][1] > array[i][1]:
                temparray.append(tuple([array[i][0], array[i + 1][1]]))
            else:
                temparray.append(tuple([array[i][0], array[i][1]]))
        else:
            temparray.append(tuple([array[i][0], array[i][1]]))
    return temparray

我希望[(3, 5), (4, 8), (10, 12), (9, 10)]的输出为[(3, 8), (9, 12)],但实际输出为[(3, 8), (4, 8), (10, 12)]

这是解决方法:

def func(intervals):
    si = sorted(intervals, key=lambda tup: tup[0])
    merged = []

    for tup in si:
        if not merged:
            merged.append(tup)
        else:
            b = merged.pop()
            if b[1] >= tup[0]:
                new_tup = (b[0], max(b[1], tup[1]))
                merged.append(new_tup)
            else:
                merged.append(b)
                merged.append(tup)
    return merged

有关更多详细信息-> https://codereview.stackexchange.com/questions/69242/merging-overlapping-intervals

1 个答案:

答案 0 :(得分:0)

如果使用临时数组,则无法尽可能减少。

def func(array):
    l=len(array)
    for i in range(1,l):
        check=False
        check=array[i-1] and abs(array[i][0] - array[i-1][1]) <=1
        if not check and array[i-1] and abs(array[i][1] - array[i-1][0]) <=1:
            array[i-1],array[i]=array[i],array[i-1]
            check=True
        if check:
            if array[i][1] > array[i-1][1]:
                array[i]=(array[i-1][0], array[i][1])
            else:
                array[i]=array[i-1]
            array[i-1]=None
    return [i for i in array if i]


assert func([(3, 5), (4, 8), (10, 12),(9, 10),]) == [(3, 8), (9, 12)]
assert func([(1,2), (3,2), (3,4)]) == [(1,4)]
assert func([(1,2), (1,2)]) == [(1,2)]
assert func([(1,2), (2,3), (2,4)]) == [(1,4)]