Мне кажется, у Андрея отличный код, но вот еще вариант. Похож на ваш, только без рекурсии.
Просто нужно держать и начало, и конец диапазона. Ну и с последним элементом чуть особая задача - почти такая, как просто закрыть диапазон, но с небольшой поправкой. Иначе он или дублируется, или не добавляется вовсе.
def closeInt(rS, rE):
if rE - rS == 1:
return ", " + str(rE)
if rE - rS > 1:
return "-" + str(rE)
return ""
def shortify(intlist):
result = str(intlist[0])
rangeStart = intlist[0]
rangeEnd = intlist[0]
for i in range(1, len(intlist)):
if intlist[i] == intlist[i-1] + 1:
rangeEnd += 1
else:
result += closeInt(rangeStart, rangeEnd)
result += ", " + str(intlist[i])
rangeStart = intlist[i]
rangeEnd = intlist[i]
result += closeInt(rangeStart, intlist[-1])
return result
print(shortify([1]))
print(shortify([2,3]))
print(shortify([2,4]))
print(shortify([4,5,6]))
print(shortify([1,2,3,4,7,9,11,13,14,15,16,17,19]))
print(shortify([1,2,4,7,8,11,12,13,14,15,16,18,19]))
print(shortify([1,2,3,4,7,9,11,13,14,15,17,18,19]))