"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>Construct the list with number of consecutive occurences with the item. Then iterate the list and get the list with the range of index of each item.</p>

<pre><code>from itertools import groupby

new_list = []

for k, g in groupby([2,2,2,2,3,4,2,2,4,4,3]):
   sum_each = 0
   for i in g:
      sum_each += 1
   ##Construct the list with number of consecutive occurences with the item like this `[(4, 2), (1, 3), (1, 4), (2, 2), (2, 4), (1, 3)]`
   new_list.append((sum_each, k))

x = 0
for (n, item) in enumerate(new_list):
   if item[0] &gt; 1:
      new_list[n] = str(x) + '-' + str(x+item[0]-1) + ',' + str(item[1])
   else:
      new_list[n] = str(x) + ',' + str(item[1])
   x += item[0]

print new_list
</code></pre>

python list