# EPI Python 13.8 compute the union of intervals

#1
``````import collections
import functools

from test_framework import generic_test
from test_framework.test_utils import enable_executor_hook

Endpoint = collections.namedtuple('Endpoint', ('is_closed', 'val'))

Interval = collections.namedtuple('Interval', ('left', 'right'))

def union_of_intervals(intervals):
"""
list of intervals, each interval object has left or right attribute, which is an endpoint object, which hs is_closed
bool and val attributes
:param intervals:
:return:
"""
# TODO - you fill in here.
if not intervals: return []
#sort based on leftmost startpoint
intervals.sort(key=lambda x:x.left.val)
res =[]
for i in range(1,len(intervals)):
prev = intervals[i-1]
curr = intervals[i]
if curr.left.val <prev.right.val:
#merge
new = Interval(min([prev.left,curr.left],key=lambda x:(x.val,not x.is_closed)),max([prev.right,curr.right],
key=lambda x:(x.val, x.is_closed)))
intervals[i] = new
elif curr.left.val == prev.right.val:
if not curr.left.is_closed and not prev.right.is_closed:
res.append(intervals[i - 1])
else:
#all True
new = Interval(min([prev.left, curr.left], key=lambda x: (x.val, not x.is_closed)),
max([prev.right, curr.right],
key=lambda x: (x.val, x.is_closed)))
intervals[i] = new
else:
#left of current is greater than right of prev
res.append(intervals[i - 1])
res.append(intervals[-1])
return res

``````

I am having a really hard time why my program isn’t passing the python EPI judge. When I was going through the debugger, my program doesn’t merge the endpoints “(176, False, 183, False), (183, True, 192, True)” , but when I hard coded the actually endpoint objects and tried to merge them using the same logic in my code ie:“don’t merge if and only if the previous right endpoint and the current left endpoint are both False” assuming these points have equal val values.

0 Likes