python - Find all possible overlap and non-overlaps from list of various ranges of numbers -


with following code can determine overlap range, give list of ranges (tuple). list size can vary. example list has 3 tuples.

ranges = [(10,20), (15,25), (18,30)] starts, ends = zip(*ranges) result = range(max(starts), min(ends) + 1) print(*result) # 18 19 20 

now want find non-overlap. same input ranges. yields:

(10,11,12,13,14) (26,27,28,29,30) 

how can achieve that?

here's solution using heapq:

range(*heapq.nsmallest(2, starts))   # -> 10, 11, 12, 13, 14 end, start = heapq.nlargest(2, ends) range(start+1, end)   # 26, 27, 28, 29, 30 

note work if overlap non-empty.

when have empty overlap can obtain "non-overlap" doing:

range(min(starts), max(ends)) 

i.e. it's whole range.

so, if wanted function you'd get:

def find_overlap_and_non_overlap(ranges):     starts, ends = zip(*ranges)     overlap = range(max(starts), min(ends)+1)     if not overlap:         return ([], range(min(starts), max(ends)+1), [])      less_non_overlap = range(*heapq.nsmallest(2, starts))     end, start = heapq.nlargest(2, ends)     greater_non_overlap = range(start+1, end+1)     return (overlap, less_non_overlap, greater_non_overlap) 

which sample input returns:

in[5]: find_overlap_and_non_overlap(ranges) out[5]: (range(18, 21), range(10, 15), range(26, 31)) in [6]: list(map(list, find_overlap_and_non_overlap(ranges))) out[6]: [[18, 19, 20], [10, 11, 12, 13, 14], [26, 27, 28, 29, 30]] 

the first element overlapping values, second non-overlapping values come before overlap , last element non-overlapping values come after overlap. if overlap empty values put in second element of tuple.


if want obtain overlap/non-overlap of pairs of ranges can repeatedly call function:

results = []  in ranges:     b in ranges:         if != b:             results.append(find_overlap_and_non_overlap([a, b])) 

Comments

Popular posts from this blog

java - UnknownEntityTypeException: Unable to locate persister (Hibernate 5.0) -

python - ValueError: empty vocabulary; perhaps the documents only contain stop words -

ubuntu - collect2: fatal error: ld terminated with signal 9 [Killed] -