根据 python 中跨度的长度从元组值列表中删除重叠跨度

Remove overlapping spans from list of tuple values based on the length of spans in python

我有一个包含字符跨度的元组列表。但是有些情况下跨度会重叠。 我的目标是以这样一种方式修改元组列表,即对于重叠,只保留较大的跨度值并删除较小的跨度值

示例:

Original list: [(2, 3), (7, 9), (10, 11), (10, 12), (15, 17), (16, 17), (20, 21), (20, 29), (21, 28)]
Modified list: [(2, 3), (7, 9), (10, 12), (15, 17), (20, 29)]

这里 (10,11) , (16,17) , (20,21) , (21,28) 被删除了,因为它们与 (10,12) , (15,17) 有更大的跨度重叠和 (20,29) 分别。

我找到了一些像 这样处理重叠的答案,但这些答案不处理更大的跨度问题。

我的想法是按降序对跨度差异的长度进行排序,然后以某种方式搜索重叠。这种对重叠的搜索是我无法弄清楚的

代码

values = [(2, 3), (7, 9), (10, 11), (10, 12), (15, 17), (16, 17), (20, 21), (20, 29), (21, 28)]
outputs = []
for value in values:
    flag = True
    outputsLoop = outputs[:]
    for output in outputsLoop:
        fromVal, toVal = output
        if value[0] in range(fromVal,toVal+1) or value[1] in range(fromVal,toVal+1):
            if (value[1]-value[0]) > (toVal - fromVal):
                outputs.remove(output)
            else:
                flag = False
    if flag == True:
        outputs.append(value)
print(outputs)

输出

[(2, 3), (7, 9), (10, 12), (15, 17), (20, 29)]

代码解释

代码循环遍历这些值,并检查检查数字中的每个部分,并保留具有较大跨度的值。如果我不得不猜测的话,它不是最有效或最干净的代码,但它确实有效。而且我确实相信,当我有时间的时候,我可能会进一步优化它。