Bernardo Sulzbach posted a much prettier version than mine that is a bit shorter.  But his is also somewhat slower (and I believe asymptotically so as the number of equal elements in subsequence goes up).  He needs to sum up a bunch of 1's repeatedly rather than do the O(1) `len()` function.

For a list with 1000 run lengths of 1000 each, we get:

In [53]: %timeit  [(k, sum(1 for _ in g)) for k, g in groupby(lst)]
10 loops, best of 3: 66.2 ms per loop
In [54]: %timeit [(k,len(l)) for k, g in groupby(lst) for l in [list(g)]]
100 loops, best of 3: 17.5 ms per loop

On Sat, Jun 10, 2017 at 7:59 PM, David Mertz wrote:
Here's a one-line version:

from itertools import groupby
rle_encode = lambda it: (
(l[0],len(l)) for g in groupby(it) for l in [list(g[1])])

Since "not every one line function needs to be in the standard library" is a guiding principle of Python, and even moreso of `itertools`, probably this is a recipe in the documentation at most.  Or maybe it would have a home in `more_itertools`.

On Sat, Jun 10, 2017 at 7:20 PM, Neal Fultz wrote:
Hello python-ideas,

I am very new to this, but on a different  forum and after a couple conversations, I really wished Python came with run-length encoding built-in; after all, it ships with zip, which is much more complicated :)

The general idea is to be able to go back and forth between two representations of a sequence:

``[1,1,1,1,2,3,4,4,3,3,3]``

and

``[(1, 4), (2, 1), (3, 1), (4, 2), (3, 3)]``

where the first element is the data element, and the second is how many times it is repeated.

I wrote an encoder/decoder in about 20 lines ( https://github.com/nfultz/rle.py/blob/master/rle.py ) and would like to offer it for the next version; I think it might fit in nicely in the itertools module, for example. I am curious about your thoughts.

Best,

-Neal

_______________________________________________
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/

--
Keeping medicines from the bloodstreams of the sick; food
from the bellies of the hungry; books from the hands of the
uneducated; technology from the underdeveloped; and putting
advocates of freedom in prisons.  Intellectual property is
to the 21st century what the slave trade was to the 16th.

--
Keeping medicines from the bloodstreams of the sick; food
from the bellies of the hungry; books from the hands of the
uneducated; technology from the underdeveloped; and putting
advocates of freedom in prisons.  Intellectual property is
to the 21st century what the slave trade was to the 16th.