1

是否有一个内置/现有的库函数类似于xrange但将间隔拆分为均匀间隔的非重叠块?

例如,如果我们调用这个函数xchunks,那么我想:

>>> xchunks(start=0, stop=18, step=5)
[(0, 4), (5, 9), (10, 14), (15, 17)]

理想情况下,这也应该适用于负数step

>>> xchunks(start=20, stop=2, step=5)
[(20, 16), (15, 11), (10, 6), (5, 3)]
4

3 回答 3

2

完整的解决方案如下:

[(s, (s+step-1 if s+step-1<stop-1 else stop-1)) for s in xrange(start,stop,step)]

使用 range 或 xrange,随你喜欢。

于 2016-02-16T10:38:08.357 回答
0

这(几乎)做你想要的:

[(s, s + step - 1) for s in range(start, stop, step)]

结果:

[(0, 4), (5, 9), (10, 14), (15, 19)]

您可以改进这一点并制作最后一对(15, 17)

于 2016-02-16T10:22:51.603 回答
0

这提供了一个与 with 一样的迭代器,xrange也适用于一个negative step。如果您使用的是 Python 3.x,请替换xrangerange.

def xchunks(start, stop, step):
    return ((i, min(i + step - 1, stop - 1)) if step > 0 else
            (i, max(i + step + 1, stop + 1))
            for i in xrange(start, stop, step))


def test():
    result = list(xchunks(start=0, stop=18, step=5))
    print list(result)
    assert result == [(0, 4), (5, 9), (10, 14), (15, 17)]

    result = list(xchunks(start=20, stop=2, step=-5))
    print list(result)
    assert result == [(20, 16), (15, 11), (10, 6), (5, 3)]
于 2016-02-16T10:36:51.580 回答