Making number pairs with for loop

Question:

I’ve been trying to get a desired result for the past few hours without success. I get lots of negative values printed out and I’m not sure if it’s because of syntax or if I don’t assign my variables properly.

I’m trying to get a set of two numbers that form a time period (the first representing the timestamp of the start of a clip and the second the end of the clip).

At first, I simply added 15 seconds before each list3 items for the first timestamp and 5 seconds after for the end of the timestamp making 20 seconds clips for each items in the list. Quickly enough I realized that some of those clips are overlapping. I’m trying to insert conditions so that this doesn’t happen. If a clip is to overlap, then make it longer and ignore the next item’s first timestamp (start of the next clip) and so on.

I have some code, but it renders mostly wrong numbers (undesired numbers, that is).

list3: [3, 20, 51, 76, 106, 126, 128, 129, 163, 181, 183, 185, 187, 236, 256, 273, 277, 281, 321, 322, 323, 325, 326]

for previous, current in zip(list3, list3[1:]):
    if current > 15:
        first_current = current-15
        second_current = current+5
        first_previous = previous-15
        second_previous = previous+5
        if second_previous+15 < first_current:
            print(f"{first_current}-{second_current}")
        else:
            print(f"{first_current-second_previous}-{second_current}")
**Desired output**:
    
    if previous_second + 20 < current_first
    print current_first - 15
    
    else if previous_second + 20 >= current_first
    print (current_first - previous_second) + 5


EDIT: Desired output:
3 --> would be ignored since it is not above 15
20 --> 5-25
51 --> 36-56
76 --> 61-81
106 --> would normally be 91-111 but would be transformed (since the next item, 126, equals 111) into 126+5... so --> 91-131
Asked By: c0nfluks

||

Answers:

Here’s what I think you’re trying to say. It’s like you have a list of events, and you have a recording that spans the entire interval. You want to extract a set of subsets of that recording, without having a bunch of dead time, but ensuring that you have covered at least 15 units before and 5 units after each event. Is that it?

If so, this does it:

list3 = [3, 20, 51, 76, 106, 126, 128, 129, 163, 181, 183, 185, 187, 236, 256, 273, 277, 281, 321, 322, 323, 325, 326]

intervals = []

for p in list3:
    # Is this point included in the current interval?  If so, 
    # extend the interval.
    base = max(0,p-15)
    if intervals and intervals[-1][0] <= base <= intervals[-1][1]:
        intervals[-1][1] = p+5
    else:
        intervals.append( [base,p+5] )

print(intervals)

Output:

[[0, 25], [36, 56], [61, 81], [91, 134], [148, 192], [221, 286], [306, 331]]
Answered By: Tim Roberts
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.