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



我有一个具有字符跨度的元组列表。但在某些情况下,跨度是重叠的。我的目标是修改元组列表,这样对于重叠,只保留较大的span值,删除较小的span

的例子:

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)有更大的跨度重叠。

我找到了一些像这样处理重叠的答案但它们不能处理大张成空间的问题

我的想法是对跨度差的长度按降序排序,然后以某种方式搜索重叠。这个重叠搜索是我无法理解的

Code

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)]

代码解释

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