在Python中将位列表转换为整数

gho*_*nsd 21 python arrays bit-manipulation list

我在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的倍数.

Mar*_*ers 44

你可以使用bitshifting:

out = 0
for bit in bitlist:
    out = (out << 1) | bit
Run Code Online (Sandbox Code Playgroud)

这很容易击败ARS提出的"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
Run Code Online (Sandbox Code Playgroud)

  • @ghostmansd:使用`.format()`字符串格式:`'0b {0:08b}'.format(整数)`将一个整数格式化为带有前导'0b'的0填充8字符字符串. (2认同)

Fre*_*ihl 13

...或使用bitstring模块

>>> from bitstring import BitArray
>>> bitlist=[1,0,0,0,0,0,0,0]
>>> b = BitArray(bitlist)
>>> b.uint
128
Run Code Online (Sandbox Code Playgroud)

  • 你没有在问题中说明这一点,所以我想我应该添加一个位串解决方案作为 Martijns 优秀答案的替代方案:-) (2认同)

ars*_*jii 6

试试这个单线:

int("".join(str(i) for i in my_list), 2)
Run Code Online (Sandbox Code Playgroud)

如果您关心速度/效率,请查看 Martijn Pieters 的解决方案。


Aka*_*all 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)
Run Code Online (Sandbox Code Playgroud)

结果:

mult and add method time is : 1.69138722958 
shifting method time is : 1.94066818592 
Run Code Online (Sandbox Code Playgroud)


小智 5

这个怎么样:

out = sum([b<<i for i, b in enumerate(my_list)])
Run Code Online (Sandbox Code Playgroud)

或按相反顺序:

out = sum([b<<i for i, b in enumerate(my_list[::-1])])
Run Code Online (Sandbox Code Playgroud)