我正在try 优化Python中的一个函数,该函数合并重叠的区间.给出一个区间列表,其中每个区间被表示为一个元组(开始、结束),我需要合并所有重叠的区间,并返回覆盖输入列表中所有区间的非重叠区间的列表.

例如,给定输入列表间隔=[(1,3),(2,6),(8,10),(15,18)],输出应为[(1,6),(8,10),(15,18)].

以下是我try 过的方法:

def merge_intervals(intervals):
    sorted_by_lower_bound = sorted(intervals, key=lambda x: x[0])
    merged = []

    for higher in sorted_by_lower_bound:
        if not merged or merged[-1][1] < higher[0]:
            merged.append(higher)
        else:
            merged[-1] = (merged[-1][0], max(merged[-1][1], higher[1]))

    return merged

print(merge_intervals([(1, 3), (2, 6), (8, 10), (15, 18)]))

这个函数似乎工作正常,但我不确定这是最有效的方式还是最有毕达式风格的方式.我希望找到一个内置的函数或更直接的方法来实现这一点,可能是使用一个Python标准库.

问:有没有一种更有效或更惯用的方法来合并Python中的区间,比如使用库函数或不同的算法来执行得更好,尤其是对于大量的区间?

推荐答案

您可以使用Numbatry 以下代码:

from numba import jit
import numpy as np

@jit
def merge_intervals_numba(intervals):
    intervals = np.array(sorted(intervals))
    merged = []

    for interval in intervals:
        if not merged or merged[-1][1] < interval[0]:
            merged.append(interval)
        else:
            merged[-1][1] = max(merged[-1][1], interval[1])
    
    return np.array(merged)

通过使用Numba,如果您正在处理非常大的间隔列表,则可以显着提高函数的速度.

Python相关问答推荐

aiohTTP与pytest的奇怪行为

双情节在单个图上切换-pPython

两极按组颠倒顺序

自动编码器和极坐标

FastAPI:使用APIRouter路由子模块功能

使用Python Great Expectations和python-oracledb

DuckDB将蜂巢分区插入拼花文件

对Numpy函数进行载体化

Django管理面板显示字段最大长度而不是字段名称

时间序列分解

如何在箱形图中添加绘制线的传奇?

运行Python脚本时,用作命令行参数的SON文本

如何使用html从excel中提取条件格式规则列表?

根据二元组列表在pandas中创建新列

Streamlit应用程序中的Plotly条形图中未正确显示Y轴刻度

计算每个IP的平均值

如何更新pandas DataFrame上列标题的de值?

什么是合并两个embrame的最佳方法,其中一个有日期范围,另一个有日期没有任何共享列?

使用特定值作为引用替换数据框行上的值

人口全部乱序 - Python—Matplotlib—映射