A few ways to make it more efficient, Pythonic:
- Eliminate the
set()
construction, since the algorithm should prune out duplicates during in the main loop. - If you just need to iterate over the results, use
yield
to generate the values. - Reduce construction of intermediate objects, for example: move the
tuple()
call to the point where the final values are produced, saving you from having to construct and throw away extra tuples, and reuse a listsaved
for storing the current time range for comparison.
Code:
def merge(times):
saved = list(times[0])
for st, en in sorted([sorted(t) for t in times]):
if st <= saved[1]:
saved[1] = max(saved[1], en)
else:
yield tuple(saved)
saved[0] = st
saved[1] = en
yield tuple(saved)
data = [
[(1, 5), (2, 4), (3, 6)],
[(1, 3), (2, 4), (5, 8)]
]
for times in data:
print list(merge(times))