问题如下:我有一个列表 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 的代码:
假设函数名为 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)
我认为这段代码能够完成任务。
是否有更简单/更聪明的方法来解决这个问题?