Newbie looking for elegant solution

Chris Angelico rosuav at gmail.com
Tue Mar 24 23:28:13 EDT 2015


On Wed, Mar 25, 2015 at 2:13 PM,  <otaksoftspamtrap at gmail.com> wrote:
> I have a list containing 9600 integer elements - each integer is either 0 or 1.
>
> Starting at the front of the list, I need to combine 8 list elements into 1 by treating them as if they were bits of one byte with 1 and 0 denoting bit on/off (the 8th element would be the rightmost bit of the first byte).
>
> Speed is not of utmost importance - an elegant solution is. Any suggestions?

Oooh fun!

>>> l = [1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1]
>>> list(int(''.join(str(i) for i in l),2).to_bytes(len(l)//8,'big'))
[177, 105, 117]

Convert it into a string, convert the string to an integer
(interpreting it as binary), then convert the integer into a series of
bytes, and interpret those bytes as a list of integers.

Example works in Python 3. For Python 2, you'll need ord() to get the
integers at the end.

I'm not sure how elegant this is, but it's a fun trick to play with :)

Next idea please! I love these kinds of threads.

ChrisA



More information about the Python-list mailing list