"Compressing" a list of integers
<p>I have a list of integers as follows:</p>

<pre><code>my_list = [2,2,2,2,3,4,2,2,4,4,3]
</code></pre>

<p>What I want is to have this as a list os strings, indexed and 'compressed', that is, with each element indicated by its position in the list and with each successive duplicate element indicated as a range, like this:</p>

<pre><code>my_new_list = ['0-3,2', '4,3', '5,4', '6-7,2', '8-9,4', '10,3']
</code></pre>

<p>EDIT: The expected output should indicate that list elements 0 to 3 have the number 2, element 3, the number 3, element 5, the number 4, elements 6 and 7, the number 2, elements 8 and 9, number 4, and element 10, number 3. </p>

<p>EDIT 2: The output list need not (indeed cannot) be a list of integers, but a list of strings instead.</p>

<p>I could find many examples of finding (and deleting) duplicated elements from lists, but nothing along the lines of what I need.</p>

<p>Could someone point out a relevant example or suggest an algorithm for solving this?</p>

<p>Thanks in advance!</p>

<p>Here's a generator-based solution similar to Padraic's.  However it avoids <code>enumerate()</code>-based index tracking and thus is probably faster for huge lists.  I didn't worry about your desired output formatting, either.</p>

<pre><code>def compress_list(ilist):
    """Compresses a list of integers"""
    left, right = 0, 0
    length = len(ilist)
    while right &lt; length:
        if ilist[left] == ilist[right]:
            right += 1
            continue
        yield (ilist[left], (left, right-1))
        left = right
    # at the end of the list, yield the last item
    yield (ilist[left], (left, right-1))
</code></pre>

<p>It would be used like this:</p>

<pre><code>my_list = [2,2,2,2,3,4,2,2,4,4,3]
my_compressed_list = [i for i in compress_list(my_list)]
my_compressed_list
</code></pre>

<p>Resulting in output of:</p>

<pre><code>[(2, (0, 3)),
 (3, (4, 4)),
 (4, (5, 5)),
 (2, (6, 7)),
 (4, (8, 9)),
 (3, (10, 10))]
</code></pre>

python list