Все решения, предлагаемые до сих пор не работают, если есть отрицательные числа во входных данных, так что диапазоны в обратном порядке требуются. Мое решение охватывает это. Работает с Python 2 и 3. Здесь:
from itertools import izip
# create the x (=start) and y (=stop) coordinates for the ranges separately
def _get_xs(iterable):
yield 0
for i in xrange(1, len(iterable)):
yield sum(iterable[:i]) + 1
def _get_ys(iterable):
yield iterable[0]
for i in xrange(1, len(iterable)):
yield sum(iterable[:i+1])
def to_ranges(iterable):
xs = _get_xs(iterable)
ys = _get_ys(iterable)
for x, y in izip(xs, ys):
if x < y:
step = 1
y += 1
elif x > y:
step = -1
y -= 1
else:
step = 0
try:
yield range(x, y, step)
except ValueError:
yield [x]
Примеры:
# edge case: instead of malformed ranges such as range(10, 10), put [10] instead
>>> list(to_ranges([1, 2, 3, 4]))
[[0, 1], [2, 3], [4, 5, 6], [7, 8, 9, 10]]
>>> list(to_ranges([4, 3, 2, 1]))
[[0, 1, 2, 3, 4], [5, 6, 7], [8, 9], [10]]
>>> list(to_ranges([4, 3, 2, -1]))
[[0, 1, 2, 3, 4], [5, 6, 7], [8, 9], [10, 9, 8]]
>>> list(to_ranges([-4, -3, -2, -1]))
[[0, -1, -2, -3, -4], [-3, -4, -5, -6, -7], [-6, -7, -8, -9], [-8, -9, -10]]
>>> list(to_ranges([-1, -2, -3, -4]))
[[0, -1], [0, -1, -2, -3], [-2, -3, -4, -5, -6], [-5, -6, -7, -8, -9, -10]]
являются те диапазоны вы на самом деле хотите? – mgilson
помните, что вы, вероятно, не хотите называть свой список «списком» со своего встроенного объекта python. – Hoopdady
@Hoopdady Да, спасибо за это ... Я назвал его для уточнения. – bioinf80