2016-02-16 2 views
1

Есть ли встроенная/существующая функция библиотеки, которая похожа на xrange, но разделяет интервал на равные интервалы между перекрывающимися фрагментами?Как отрезать интервал в Python?

Например, если мы называем эту функцию 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)] 

ответ

0

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

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

Результат:

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

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

0

Это дает итератор с 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)] 
2

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

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

диапазон использования или xrange, в зависимости от того, вам нравится.

Смежные вопросы