首页 > 解决方案 > 根据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) 有更大的跨度重叠) 分别。

我找到了一些解决此类重叠的答案,这些答案不涉及更大的跨度问题。

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

标签: pythonlisttuples

解决方案


代码

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

代码说明

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


推荐阅读