I have a list of integers that is sorted and contains no duplicates:
mylist = [2, 5,6,7, 11,12, 19,20,21,22, 37,38, 40]
I want a summarized text representation that shows groups of adjacent integers in a compressed form as a hyphenated pair. To be specific: Adjacent implies magnitude differing by 1. So an integer i is considered to be adjacent to j if j = i ± 1. Recall that the list is sorted. That means that adjacent integers will appear in monotonically increasing series in the list.
So I want some elegant Python that will represent mylist as the string
"2, 5-7, 11-12, 19-22, 37-38, 40,"
That is,
- an isolated integer (example:
2, because the list contains neither1nor3) is represented as2, - a group of adjacent integers (example:
19,20,21,22because each member of the group differs from one other member by 1) is represented as‹lowest›-‹highest›,that is19-22,.
I can’t believe this is a problem nobody has thought important enough to solve. Feel free to point me at a solution I have missed.
>Solution :
You can try this:
mylist = [2, 5, 6, 7, 11, 12, 19, 20, 21, 22, 37, 38, 40]
ans = []
ret = ''
# assuming mylist is sorted
for i in mylist:
if len(ans) == 0 or ans[-1][1] < i - 1: #if the array is empty or we can't add current value to the last range
ans.append([i, i]) # make a new range
else:
ans[-1][1] = i # add to last range
for i in ans:
# formating
if i != ans[0]:
ret = ret + ' '
if i[0] == i[1]:
ret = f'{ret}{i[0]},'
else:
ret = f'{ret}{i[0]}-{i[1]},'
print(ret)
Hope this helps!