Convert elements of a list into binary

18,380

Solution 1

You can use bitwise operators like this:

>>> lst = [0, 1, 0, 0]
 >>> bin(int(''.join(map(str, lst)), 2) << 1)
'0b1000'

Solution 2

This is not a fancy one-liner, but simple and fast.

lst = [0,1,1,0]

num = 0
for b in lst:
    num = 2 * num + b
print(num) # 6

Solution 3

The accepted answer, joining a string, is not the fastest.

import random

lst = [int(i < 50) for i in random.choices(range(100), k=100)]


def join_chars(digits): 
    return int(''.join(str(i) for i in digits), 2)    

%timeit join_chars(lst) 
13.1 µs ± 450 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)


def sum_digits(digits): 
    return sum(c << i for i, c in enumerate(digits)) 

%timeit sum_digits(lst)                                                                                                                                                                                                 
5.99 µs ± 65.5 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

So bit-banging sum_digits() comes first by a factor of x2!

Solution 4

slightly different approach with comprehension (i hope it will be helpful for someone)

arr =[192, 168, 0, 1]
arr_s = [bin(i)[2:].zfill(8) for i in ar]
num = int(''.join(arr_s), 2)

same, but reverse order (and also one-liner suitable for lambdas )

arr = [24, 85, 0]
num = int(''.join( [bin(i)[2:].zfill(8) for i in arr[::-1]] ), 2)

using bit-wise and reduce:

reduce ((lambda x,y: (x<<8)|y), arr[::-1]) 
Share:
18,380
humble
Author by

humble

Updated on June 29, 2022

Comments

  • humble
    humble almost 2 years

    Suppose I have a list:

    lst = [0, 1, 0, 0]
    

    How can I make python interpret this list as a binary number 0100 so that 2*(0100) gives me 01000?

    The only way that I can think of is to first make a function that converts the "binary" elements to corresponding integers(to base 10) and then use bin() function..

    Is there a better way?