def check_overlap(l): for i in range(len(l)): #print(f'### ITERATION at index i: {i}') for j in range(i+1, len(l)): len_i = len(range(l[i][0], l[i][1])) len_j = len(range(l[j][0], l[j][1])) #print(len_i) #print(len_j) if len_i < len_j: x = l[i][:2] y = l[j][:2] else: x = l[j][:2] y = l[i][:2] rangex = range(x[0],x[1]) rangey = range(y[0],y[1]) #print(f'Target is: {x}\nY: {y}') if rangex.start <= rangey.start: if rangex.stop > rangey.start: print('## Overlap!') print(f'X: {rangex}\nY: {rangey}') elif rangex.start >= rangey.start: if rangex.start < rangey.stop: print('## Overalp!') print(f'X: {rangex}\nY: {rangey}') def range_overlapping(x, y): if x.start == x.stop or y.start == y.stop: return False return ((x.start < y.stop and x.stop > y.start) or (x.stop > y.start and y.stop > x.start)) def overlap(x, y): if not range_overlapping(x, y): return set() return set(range(max(x.start, y.start), min(x.stop, y.stop)+1)) def remove_overlapping(l, overlaps): return def solve_overlap(l): #print(f'Input len: {len(l)}') if len(l) == 0: return [] res_l = l.copy() for i in range(len(l)): #print(f'### ITERATION at index i: {i}') for j in range(i+1, len(l)): len_i = len(range(l[i][0], l[i][1])) len_j = len(range(l[j][0], l[j][1])) #print(len_i) #print(len_j) if len_i < len_j: x = l[i][:2] y = l[j][:2] else: x = l[j][:2] y = l[i][:2] #print(f'Target is: {x}\nY: {y}') rangex = range(x[0],x[1]) rangey = range(y[0],y[1]) if rangex.start <= rangey.start: if rangex.stop > rangey.start: #print('## Overlap!') #print(f'X: {rangex}\nY: {rangey}') to_pop = l[i] try: res_l.remove(to_pop) except: print(f'{to_pop} NOT IN LIST') elif rangex.start >= rangey.start: if rangex.start < rangey.stop: #print('## Overalp!') #print(f'X: {rangex}\nY: {rangey}') to_pop = l[i] try: res_l.remove(to_pop) except: print(f'{to_pop} NOT IN LIST') #print('-'*25) #print(f'Ouput len: {len(res_l)}') return res_l if __name__ == "__main__": l = [[84, 106, "PER"], [108, 114, "LOC"], [119, 121, "MISC"], [123, 124, "MISC"], [164, 169, "PER"], [295, 298, "MISC"], [311, 312, "MISC"], [338, 345, "LOC"], [381, 384, "MISC"], [525, 530, "PER"], [804, 808, "PER"], [896, 906, "MISC"], [931, 936, "PER"], [960, 965, "PER"], [1006, 1029, "MISC"], [1031, 1032, "MISC"], [1083, 1084, "MISC"], [1121, 1122, "MISC"], [1163, 1173, "PER"], [1266, 1274, "PER"], [1297, 1300, "MISC"], [1462, 1463, "MISC"], [1500, 1501, "MISC"], [1569, 1579, "PER"], [1589, 1594, "PER"], [1822, 1830, "PER"], [1832, 1836, "MISC"], [1869, 1870, "MISC"], [1910, 1918, "MISC"], [1954, 1963, "LOC"], [1986, 1994, "MISC"], [1996, 2000, "MISC"], [2049, 2053, "MISC"], [2061, 2066, "MISC"], [2081, 2093, "MISC"], [2096, 2102, "LOC"], [2111, 2117, "LOC"], [2135, 2139, "LOC"], [2209, 2220, "MISC"], [2244, 2247, "MISC"], [2302, 2311, "MISC"], [2319, 2322, "MISC"], [2325, 2330, "PER"], [2337, 2340, "PER"], [2446, 2453, "LOC"], [2459, 2466, "PER"], [2715, 2723, "PER"], [2734, 2742, "PER"], [2775, 2782, "MISC"], [2821, 2828, "MISC"], [2831, 2840, "MISC"], [2843, 2845, "MISC"], [2857, 2869, "PER"], [2871, 2877, "LOC"], [2882, 2884, "MISC"], [2886, 2888, "MISC"], [2943, 2944, "MISC"], [3009, 3018, "MISC"]] check_overlap(l)