, 2.
def reduce_list(seq):
l = sorted(set(seq))
low = high = l[0]
step = None
for v in l[1:]:
if step is None or v - high == step:
step = v - high
high = v
elif high - low == step:
yield low, low, None
step = v - high
low = high
high = v
else:
yield low, high, step
low = high = v
step = None
if high - low == step:
yield low, low, None
step = None
low = high
yield low, high, step
def format_element(low, high, step):
if step is None:
assert low == high
return "%s" % (low,)
elif step == 1:
return "%s-%s" % (low, high)
else:
return "%s-%sx%s" % (low, high, step)
def format_list(seq):
return ','.join(format_element(*e) for e in seq)
:
def test( *args ):
print args, "==", format_list(reduce_list(args))
test(1)
test(1, 2)
test(1, 2, 3)
test(0, 10)
test(0, 10, 20)
test(0, 10, 11, 12, 14, 16)
test(0, 2, 4, 8, 16, 32, 64)
test(0, 1, 3, 4, 6, 7, 9, 10)
test(0, 1, 3, 6, 10, 15, 21, 28)
:
(1,) == 1
(1, 2) == 1,2
(1, 2, 3) == 1-3
(0, 10) == 0,10
(0, 10, 20) == 0-20x10
(0, 10, 11, 12, 14, 16) == 0,10-12,14,16
(0, 2, 4, 8, 16, 32, 64) == 0-4x2,8,16,32,64
(0, 1, 3, 4, 6, 7, 9, 10) == 0,1,3,4,6,7,9,10
(0, 1, 3, 6, 10, 15, 21, 28) == 0,1,3,6,10,15,21,28