Fusión de intervalos superpuestos python

Actualmente, tengo intervalos de:

temp_tuple = [[-25, -14], [-21, -16], [-20, -15], [-10, -7], [-8, -5], [-6, -3], [2, 4], [2, 3], [3, 6], [12, 15], [13, 18], [14, 17], [22, 27], [25, 30], [26, 29]] 

en orden ascendente por el límite inferior. Mi tarea es fusionar intervalos superpuestos para que el resultado sea:

 [-25, -14] [-10, -3] [2, 6] [12, 18] [22, 30] 

Mi primer bash consistió en eliminar intervalos que están completamente dentro de intervalos anteriores, como [-21, -16] que cae dentro de [-25, -14]. Pero eliminar objetos dentro de una lista siguió interfiriendo con la condición del bucle. Mi segundo bash de eliminar intervalos innecesarios fue:

 i = 0 j = 1 while i < len(temp_tuples): while j  temp_tuples[j][1]: del temp_tuples[j] j += 1 i += 1 

pero esto no elimina todos los intervalos innecesarios por alguna razón. ¿Qué tengo que hacer?

Hace que sea un poco más fácil de procesar (como en pensar) si en cambio configura una nueva lista. Además, también puede mantener sus datos originales.

 temp_tuple.sort(key=lambda interval: interval[0]) merged = [temp_tuple[0]] for current in temp_tuple: previous = merged[-1] if current[0] <= previous[1]: previous[1] = max(previous[1], current[1]) else: merged.append(current) 

Si ahora print(merged) resultaría:

 [[-25, -14], [-10, -3], [2, 6], [12, 18], [22, 30]] 

La característica más destacada de la solución a continuación es ejecutar una lista llamada final paralela a la lista de entrada. Antes de ingresar al bucle for , la lista final inserta el primer elemento de la matriz en él. Entonces comienza la comparación. ¡Eso es!

 def merger(a): final=[] final.append(a[0]) for i in range(1,len(a)): if a[i][0]<=final[-1][1]: if a[i][1]>final[-1][1]: low_limit=final[-1][0] hi_limit=a[i][1] final.pop() final.append([low_limit,hi_limit]) if a[i][1]<=final[-1][1]: low_limit=final[-1][0] hi_limit=final[-1][1] final.pop() final.append([low_limit,hi_limit]) if final[-1][0] 

Salida:

 [[-25, -14], [-10, -3], [2, 6], [12, 18], [22, 30]]