我在Python中有这样的列表:[1,0,0,0,0,0,0,0]
。我可以将它转换为整数,就像我输入0b10000000(即转换为128)一样吗?
我还需要将[1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0]
之类的序列转换为整数(这里它将返回0b1100000010000000,即259)。
如果有必要,列表长度总是8的倍数。
答案 0 :(得分:42)
您可以使用bitshifting:
out = 0
for bit in bitlist:
out = (out << 1) | bit
这很容易击败A. R. S.提出的“int cast”方法,或者由Steven Rumbalski提出的修改后的演员阵容:
>>> def intcaststr(bitlist):
... return int("".join(str(i) for i in bitlist), 2)
...
>>> def intcastlookup(bitlist):
... return int(''.join('01'[i] for i in bitlist), 2)
...
>>> def shifting(bitlist):
... out = 0
... for bit in bitlist:
... out = (out << 1) | bit
... return out
...
>>> timeit.timeit('convert([1,0,0,0,0,0,0,0])', 'from __main__ import intcaststr as convert', number=100000)
0.5659139156341553
>>> timeit.timeit('convert([1,0,0,0,0,0,0,0])', 'from __main__ import intcastlookup as convert', number=100000)
0.4642159938812256
>>> timeit.timeit('convert([1,0,0,0,0,0,0,0])', 'from __main__ import shifting as convert', number=100000)
0.1406559944152832
答案 1 :(得分:12)
...或使用bitstring模块
>>> from bitstring import BitArray
>>> bitlist=[1,0,0,0,0,0,0,0]
>>> b = BitArray(bitlist)
>>> b.uint
128
答案 2 :(得分:6)
我遇到的方法稍微优于Martijn Pieters解决方案,尽管他的解决方案当然更漂亮。我对结果感到有些惊讶,但无论如何......
import timeit
bit_list = [1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0]
def mult_and_add(bit_list):
output = 0
for bit in bit_list:
output = output * 2 + bit
return output
def shifting(bitlist):
out = 0
for bit in bitlist:
out = (out << 1) | bit
return out
n = 1000000
t1 = timeit.timeit('convert(bit_list)', 'from __main__ import mult_and_add as convert, bit_list', number=n)
print "mult and add method time is : {} ".format(t1)
t2 = timeit.timeit('convert(bit_list)', 'from __main__ import shifting as convert, bit_list', number=n)
print "shifting method time is : {} ".format(t2)
结果:
mult and add method time is : 1.69138722958
shifting method time is : 1.94066818592
答案 3 :(得分:4)
试试这个单行:
int("".join(str(i) for i in my_list), 2)
如果你关注速度/效率,请看看Martijn Pieters的解决方案。
答案 4 :(得分:0)
这如何:
out = sum([b<<i for i, b in enumerate(my_list)])
或以相反的顺序:
out = sum([b<<i for i, b in enumerate(my_list[::-1])])