from functools import reduce def merge_func(last, current): merged = [last[0], current[1]] return merged def is_mergeable(first, second): return first[1] == second[0] def merge_by_dist(source, merge_function, can_be_merged): def reducer(acc, item): if len(acc) == 0: return [item] last = acc[-1] if is_mergeable(last, item): merged = merge_func(last, item) acc = acc[:-1] return acc + [merged] return acc + [item] return reduce(reducer, source, []) merge_by_dist([[1,2], [2,3], [3,4], [5,6]], merge_func, is_mergeable)