Checking for overlap between time spans

后端 未结 5 2172
别跟我提以往
别跟我提以往 2021-01-06 01:23

I have a list of time entries (HHMM format) with a start time and a stop. I\'m having trouble figuring out how to code it in Python where it returns if there\'s an overlap o

5条回答
  •  爱一瞬间的悲伤
    2021-01-06 02:07

    First we sort the list by the start time.

    Then we loop over it checking if the next start time is lower then the previous end time.

    This will check if x+1 overlaps with x (not if x+2 overlaps with x, etc.)

    intervals = [[100,200],[150,250],[300,400]]
    intervalsSorted = sorted(intervals, key=lambda x: x[0]) # sort by start time
    for x in range(1,len(intervalsSorted)):
        if intervalsSorted[x-1][1] > intervalsSorted[x][0]:
            print "{0} overlaps with {1}".format( intervals[x-1], intervals[x] )
    
    # result: [100, 200] overlaps with [150, 250]
    

    The following should give you all overlappings in the whole list.

    intervals = [[100,200],[150,250],[300,400],[250,500]]
    
    overlapping = [ [x,y] for x in intervals for y in intervals if x is not y and x[1]>y[0] and x[0]

    Note that this is a O(n*n) lookup. (anyone correct me here if I'm wrong!)

    This is likely slower than the first (didn't test it, but I assume it is) because this iterates over the whole list for each single index. Should be similar to arbarnert's nested for loops example. But then again this does give you all the overlapping values as opposed to the first method I showed that only checked for overlapping times between those next to it (sorted by start time).

    Extended test gives:

    intervals = [[100,200],[150,250],[300,400],[250,500],[10,900],[1000,12300],[-151,32131],["a","c"],["b","d"],["foo","kung"]]
    
    overlapping = [ [x,y] for x in intervals for y in intervals if x is not y and x[1]>y[0] and x[0]

提交回复
热议问题