python - 识别列表中的所有重叠元组
问题描述
我目前有一个元组列表(尽管我控制列表和元组的创建,因此如果需要可以更改它们的类型)。每个元组都有一个开始和结束整数以及一个带有该范围源 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。
解决方案
这是一个使用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
推荐阅读
- python - Python pandas:对分组值x的前n行求和
- ms-access - 访问 - 基于另一个字段自动更新是/否字段
- scala - 在 Dotty Scala 中访问嵌套类型参数
- javascript - 在 JSON 服务器中使用自定义 ID 时出现 PUT 问题
- python-3.x - 为什么在布尔过滤数组中切片没有发生..?
- python - 基本 Docker 绑定挂载故障排除
- javascript - 我正在努力在我的代码中定义 yVelocity
- oracle - 如何使用 APEX_UTIL.PREPARE_URL?
- python - 抓取动态信息
- vue.js - Vue - 检测元素是否已添加到 v-for 对象