【问题标题】:Remove overlapping spans from list of tuple values based on the length of spans in python根据python中跨度的长度从元组值列表中删除重叠跨度
【发布时间】:2021-10-19 11:38:28
【问题描述】:

我有一个包含字符跨度的元组列表。但是在某些情况下,跨度重叠。 我的目标是修改元组列表,使得重叠时只保留较大的跨度值并删除较小的跨度

例子:

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) 分别。

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

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

【问题讨论】:

  • 一个小困惑,这里你说 (21,28) 应该被删除以与 (20,29) 重叠,是我误解,还是错误?
  • 是的,(21,28) 位于 (20,29) 内部,因此应该删除
  • 那么,您介意再解释一下,以便我提供帮助吗?我想我误解了你最初的问题
  • 好的,所以基本上考虑一个数轴,其中你有一个从 20 到 29 的行,然后是从 21 到 28 的另一行。现在,21 > 20 和 28
  • 啊,是的。现在确实有道理,让我想想代码,我会更新它

标签: python list tuples


【解决方案1】:

代码

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

代码说明

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

【讨论】:

  • 感谢您的回复 :) 但是由于 (15,17) 存在所以输出不加起来,所以 (16,17) 是重叠且比 (15,17) 应该小的差距被移除。与 (21,28) 相同
  • 已修复 :) @Alex .
  • 谢谢扎伊德!能否请您定义优化的范围,即如果您能指出可以优化什么或如何优化,我也可以尝试一下
  • @Alex 一方面,代码不是最干净的,它可以缩短并且更快。我确实认为 python 中的一些标准函数可以替换部分代码,或者一些较新发布的运算符/列表理解/查找在这里可能有用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-23
  • 1970-01-01
  • 2012-08-23
  • 1970-01-01
  • 2019-01-03
  • 2015-05-18
相关资源
最近更新 更多