首页 > 解决方案 > 识别列表中的所有重叠元组

问题描述

我目前有一个元组列表(尽管我控制列表和元组的创建,因此如果需要可以更改它们的类型)。每个元组都有一个开始和结束整数以及一个带有该范围源 ID 的字符串。我要做的是识别元组中的所有重叠范围。

目前我有

a = [(0, 98, '122:R'), 
     (100, 210, '124:R'),
     (180, 398, '125:R'),
     (200, 298, '123:R')]
highNum = 0
highNumItem = ''
for item in a:
    if item[0] < highNum:
        print(highNumItem + ' overlaps ' + item[2])
        if item[1] > highNum:
            highNum = item[1]
            highNumItem = item[2]

    
# 124:R overlaps 125:R
# 125:R overlaps 123:R

哪个输出足够的重叠信息应该能够手动查看和修复。但是,它错过了识别一些重叠的集合。我不禁想到有一个相对明显的解决方案,我只是缺少或没有使用正确的搜索词来查找示例。但理想情况下,我希望输出实际上是

124:R overlaps 125:R & 123:R
125:R overlaps 123:R

但是使用我的比较方法,我看不到一种方法来捕捉重叠跨越两个以上相邻范围的罕见实例。如果有人能指出适合此的函数或比较方法,我将不胜感激。

此外,如果重要的话,我目前坚持使用 python 2.7,但需要能够在 3rd 方应用程序允许时将解决方案移植到 3.x。

标签: python

解决方案


这是一个使用intspan计算重叠的示例。(使用 Python 3.8)

from itertools import combinations
from intspan import intspan

a = [(0, 98, '122:R'), (100, 210, '124:R'), (180, 398, '125:R'), (200, 298, '123:R')]

d = {}
for one, two in combinations(a,2):
    # if the 2 ranges intersect
    if intspan.from_range(*one[0:2]) & intspan.from_range(*two[0:2]):
        d.setdefault(one[2], []).append(two[2])

for key, v in d.items():
    print(key + ',' + ','.join(v))

印刷:

124:R,125:R,123:R
125:R,123:R

推荐阅读