Как разделить интервал в 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)]