Вы можете сделать это красиво с itertools.groupby, заметив, что разница между пунктами в списке, и счетчик являются постоянными, а числа являются последовательными
например
38 - 0 = 38
98 - 1 = 97
110 - 2 = 108
111 - 3 = 108
112 - 4 = 108
120 - 5 = 115
121 - 6 = 115
898 - 7 = 891
В этом примере 108-ые сгруппированы вместе, а 115 сгруппированы вместе. Теперь некоторый код
>>> from itertools import groupby, count
>>> L = [38, 98, 110, 111, 112, 120, 121, 898]
>>> groups = groupby(L, key=lambda item, c=count():item-next(c))
>>> tmp = [list(g) for k, g in groups]
посмотреть, что у нас до сих пор
>>> tmp
[[38], [98], [110, 111, 112], [120, 121], [898]]
обращенного к желаемому результату
>>> [str(x[0]) if len(x) == 1 else "{},{}".format(x[0],x[-1]) for x in tmp]
['38', '98', '110,112', '120,121', '898']
почему 110 -> 112 считается последовательным? – hexparrot
@hexparrot у него 110, 111, 112; Я думаю, что он означает включать все числа в «диапазон», пока не достигнет числа, которое больше не будет последовательным. – 2rs2ts
ах, такой глупый недосмотр. теперь, я помню codegolf, который делает это ... brb. – hexparrot