【发布时间】:2019-02-14 20:21:55
【问题描述】:
问题如下:我有一个列表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)
我相信代码可以完成这项工作。
有没有更简单/更智能的方法来解决这个问题?
【问题讨论】:
-
在代码审查中交叉发布和回答:codereview.stackexchange.com/q/203468/31562