Проблема в следующем: у меня есть список intervals
, который состоит из кортежей вида (start, end
) [с start <= end
].Каждый кортеж представляет интервал (реальной строки).Мы предполагаем, что интервалы в intervals
не перекрывают друг друга.Учитывая новый интервал (s,e)
, я хотел бы написать функцию Python, которая проверяет, перекрывает ли (s, e)
какой-либо из интервалов в intervals
.Если (s, e)
имеет непустое пересечение с хотя бы одним из интервалов в intervals
, функция должна вернуть индексы этих интервалов в списке intervals
.
Скажите, что функция называется find_intersections
.Тогда, учитывая, что intervals = [(1, 3.5), (5.5, 8.7), (10.2, 22.6), (22.7, 23.1)]
, ожидаемые результаты будут:
find_intersection(intervals, (3.2, 5.))
возврат array([0])
find_intersection(intervals, (6.1, 7.3))
возврат array([1])
find_intersection(intervals, (9.1, 10.2))
возвращает No intersection.
find_intersection(intervals, (5.8, 22.9))
возвращает array([1, 2, 3])
.
Код для find_intersection
Я написал:
import itertools
def find_intersection(intervals, new_interval):
_times = sorted(list(itertools.chain.from_iterable(intervals)))
ind = np.searchsorted(_times, np.asarray(new_interval))
parity = np.mod(ind, 2)
if (not np.any(parity)) and ind[1] == ind[0]:
print('No intersection.')
elif parity[0] == 1:
ub = ind[1] if parity[1] == 1 else ind[1] - 1
return np.arange((ind[0] - 1) / 2, (ub - 1) / 2 + 1)
elif parity[1] == 1:
lb = ind[0] if parity[0] == 1 else ind[0] + 1
return np.arange((lb - 1) / 2, (ind[1] - 1) / 2 + 1)
else:
lb = ind[0] if parity[0] == 1 else ind[0] + 1
ub = ind[1] if parity[1] == 1 else ind[1] - 1
return np.arange((lb - 1) / 2, (ub - 1) / 2 + 1)
Я считаю,что код выполняет свою работу.
Есть ли более простой / умный способ решения этой проблемы?