def merge(spans): """Merge overlapping or touching [start, end] spans, in any order.""" if not spans: return [] ordered = sorted(spans, key=lambda s: (s[0], s[1])) out = [list(ordered[0])] for start, end in ordered[1:]: last = out[-1] if start <= last[1]: last[1] = max(last[1], end) else: out.append([start, end]) return [tuple(s) for s in out]