python - 识别列表中的所有重叠元组

标签 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
但是使用我的比较方法,我无法找到一种方法来捕捉重叠跨越超过 2 个相邻范围的罕见实例。如果有人能指出适合于此的函数或比较方法,我将不胜感激。
另外,如果重要的话,我目前坚持使用 python 2.7,但需要能够在 3rd 方应用程序允许的情况下将解决方案移植到 3.x。

最佳答案

用另一对的较小数字检查一对较大的数字:

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

for i, base_data in enumerate(a):
    for check_data in a[i + 1:]:
        if base_data[1] > check_data[0]:
            print(f"{base_data[2]} overlaps {check_data[2]}")
#prints:
#124:R overlaps 125:R
#124:R overlaps 123:R
#125:R overlaps 123:R
如果您希望将其存储在组中:
from collections import defaultdict

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

for i, base_data in enumerate(a):
    for check_data in a[i + 1:]:
        if base_data[1] > check_data[0]:
            d[base_data[2]].append(check_data[2])


print(d)
#prints:
#defaultdict(<class 'list'>, {'124:R': ['125:R', '123:R'], '125:R': ['123:R']})
#but can *easily* be iterated over to pretty print:
print("\n".join([f'{key} overlaps {" & ".join(d[key])}' for key in d]))
#prints:
#124:R overlaps 125:R & 123:R
#125:R overlaps 123:R
字典比打印要好得多,因为它实际上存储了数据,而不仅仅是打印数据。打印数据也可以更加可控。另外,使用 defaultdictdict使代码更加紧凑。

关于python - 识别列表中的所有重叠元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63529127/

相关文章:

python - 使用按位运算验证整除规则

Python Tkinter - 保存 Canvas - tkinter 崩溃

python - 类型错误 : '>' not supported between instances of 'datetime.datetime' and 'str'

python - 如何使用注释和聚合在 Django 的 ORM 中执行此 GROUP BY 查询

python - 如何在 tkinter 中使用文件对话框获取文件名?

python - 在python中查找一组字符串的最小汉明距离

python条件锁

python - 非常简单的代码在c中加载python模块

python - 关于 AttributeError : module 'scipy.misc' has no attribute 'imread'

python - 以子列表的形式获取列表的所有可能组合