Tengo una lista de tuplas donde cada tupla es (start-time, end-time)
. Estoy intentando combinar todos los intervalos de tiempo superpuestos y devolver una lista de intervalos de tiempo distintos. Por ejemplo Fusionando una lista de tuplas de rangos de tiempo que tienen rangos de tiempo superpuestos
[(1, 5), (2, 4), (3, 6)] ---> [(1,6)]
[(1, 3), (2, 4), (5, 8)] ---> [(1, 4), (5,8)]
Aquí es cómo implementado.
# Algorithm
# initialranges: [(a,b), (c,d), (e,f), ...]
# First we sort each tuple then whole list.
# This will ensure that a<b, c<d, e<f ... and a < c < e ...
# BUT the order of b, d, f ... is still random
# Now we have only 3 possibilities
#================================================
# b<c<d: a-------b Ans: [(a,b),(c,d)]
# c---d
# c<=b<d: a-------b Ans: [(a,d)]
# c---d
# c<d<b: a-------b Ans: [(a,b)]
# c---d
#================================================
def mergeoverlapping(initialranges):
i = sorted(set([tuple(sorted(x)) for x in initialranges]))
# initialize final ranges to [(a,b)]
f = [i[0]]
for c, d in i[1:]:
a, b = f[-1]
if c<=b<d:
f[-1] = a, d
elif b<c<d:
f.append((c,d))
else:
# else case included for clarity. Since
# we already sorted the tuples and the list
# only remaining possibility is c<d<b
# in which case we can silently pass
pass
return f
Estoy tratando de averiguar si
- es el a una función incorporada de alguna módulo de Python que puede hacer esto de manera más eficiente? o
- ¿Hay una manera más pitonica de lograr el mismo objetivo?
Su ayuda es apreciada. ¡Gracias!
Gracias! Estoy de acuerdo en que debería eliminar 'set()'. El lazo se ocupa de eso. Al igual que la idea de ceder las tuplas según sea necesario en lugar de agregar a una lista. –
Desafortunadamente, esto falla si 'len (times) == 0'. – phihag
Además, no funciona si la lista de entrada no está ordenada (por ejemplo '[(3, 6), (2, 4)]'). El valor inicial de 'saved' debe ser el primer elemento de la lista ** sorted **. –