问题如下:我有一个列表 intervals
,它由 (start, end
) [with 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)
我相信代码可以完成这项工作。
有没有更简单/更智能的方法来解决这个问题?
最佳答案
intervals = [(1, 3.5), (5.5, 8.7), (10.2, 22.6), (22.7, 23.1)]
def find_intersection(intervals, new_interval):
start, end = new_interval
return (i for i, (a, b) in enumerate(intervals)
if (a < start < b) or (a < end < b) or (a > start and b < end))
candidates = ((3.2, 5.), (6.1, 7.3), (9.1, 10.2), (5.8, 22.9))
for c in candidates:
print(c, "->", list(find_intersection(intervals, c)))
关于python - 查找具有给定区间的非空交集的区间,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52257119/