Search code examples
pythonrangesliceskip

Python: Create a range of ordered numbers skipping the inverse of every Nth through Nth+D number


Greetings stackoverflow friends. I've decided to get a little wild this evening and party with for loops to iterate through a list I have created.

It appears the party has been pooped on, though, as the manner through which I would like to create a range is not readily apparent, neither through research nor playing around, and proving bothersome

The Desire: I would like to create a range of numbers much in a similar way that a range is usually created... by specifying range(start, stop, step) but with the minor alteration that I may additionally specify a step 'sweep' value such that range performed more like range(start, stop, step:sweep)

That is to say, if the glorious function above existed it could be used as following;

range(0,16,3:5)
# [0,3,4,5,8,9,10,13,14,15]

Another example!

range(0,24,2:9)
# [0,2,3,4,5,6,7,8,9,11,12,13,14,15,16,17,18,20,21,22,23]

Yet another!

range(0,24,3:9)
# [0,3,4,5,6,7,8,9,12,13,14,15,16,17,18,21,22,23]

Last one.

swept_range(5,20,3,4)
# [7, 8, 11, 12, 15, 16, 19]

In English, I desire a simple way to create a range of ordered numbers holding on to every Nth through Nth + D number group where D is some positive number.

I've looked at slices to no avail.

I know MATLAB can succinctly do this but wasn't sure this exists in Python - does anyone?


Solution

  • How about this generator, using modular arithmetic:

    def swept_range(start, stop, step=1, sweep=1):
        for i in range(start, stop):
            if not 0 < i % sweep < step:
                yield i
    

    You could also use a list comprehension, if you need a sequence, rather than an iterator:

    def swept_range(start, stop, step=1, sweep=1):
        return [i for i in range(start, stop) if not 0 < i % sweep < step]