问题如下:我有一个列表 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/

    10-13 04:30