Как разделить интервал в Python?

Есть ли встроенная / существующая библиотечная функция, которая похожа на 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)]

3 ответа

Полное решение этого будет выглядеть так:

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

используйте range или xrange, в зависимости от того, что вам нравится.

Это (почти) делает то, что вы хотите:

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

Результат:

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

Вы можете улучшить это и сделать последнюю пару (15, 17),

Это дает итератор как с xrange а также работает с негативом step, Если вы используете Python 3.x, замените xrange с range,

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)]
Другие вопросы по тегам