将列表的元素转换为二进制

时间:2016-08-13 17:15:16

标签: python python-3.x binary

假设我有一个清单:

lst = [0, 1, 0, 0]

如何让python将此列表解释为二进制数0100​​,以便2*(0100)为我提供01000

我能想到的唯一方法是先创建一个转换"二进制"的函数。元素到相应的整数(到基数10)然后使用bin()函数..

有更好的方法吗?

6 个答案:

答案 0 :(得分:3)

您可以像这样使用bitwise operators

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

答案 1 :(得分:1)

接受的答案(连接字符串)不是最快的。

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)

因此,sum_digits()首先是 x2倍!

答案 2 :(得分:1)

理解方式略有不同(我希望这对某人有帮助)

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

相同但相反的顺序(也适用于lambda的单线)

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

逐位使用并减少:

reduce ((lambda x,y: (x<<8)|y), arr[::-1]) 

答案 3 :(得分:0)

您可以使用以下代码来连接列表元素:

x=[0, 1, 0, 0]
b=''.join(map(str,x))
print(b)

输出:

C:\python\prog>python trying.py

0100

答案 4 :(得分:0)

在Jupyter中:-

lst = [4,5,7,1,2]
bin(int(''.join(map(str, lst)))<<1)

o / p:-'0b10110010100100000'

在Python Shell中:-

>>> lst =[4,5,7,1,2]
>>> bin(int(''.join(map(str, lst)))<<1)

o / p:-'0b10110010100100000'

答案 5 :(得分:-1)

您可以尝试:

l = [0, 0, 1, 0]
num = int(''.join(str(x) for x in l), base=2)