Search code examples
python

Text representation of a list with gaps


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 neither 1 nor 3) is represented as 2,
  • a group of adjacent integers (example: 19,20,21,22 because each member of the group differs from one other member by 1) is represented as ‹lowest›-‹highest›, that is 19-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!