Python:二进制字符串的布尔列表

时间:2014-02-27 00:19:57

标签: python list binary boolean

在python中将布尔列表转换为二进制字符串的最快方法是什么?

e.g。 boolList2BinString([True,True,False])='0b110'。

另外,我如何将二进制字符串转换为二进制文字?这会花费更多的时间,而不仅仅是从布尔列表转换为二进制文字immediatley吗?如何做到这一点?

e.g。 boolList2Bin([True,True,False])= 0b110。

谢谢!

4 个答案:

答案 0 :(得分:8)

关于您的第一个问题,您可以使用list comprehension *和conditional expression

>>> def boolList2BinString(lst):
...     return '0b' + ''.join(['1' if x else '0' for x in lst])
...
>>> boolList2BinString([True, True, False])
'0b110'
>>>

关于你的第二个,你不能“将二进制字符串转换为二进制文字”。顾名思义,literals必须字面输入

>>> x = 0b110
>>>

也许你的意思是你想要从输出中删除引号?如果是,请使用print

>>> def boolList2BinString(lst):
...     return '0b' + ''.join(['1' if x else '0' for x in lst])
...
>>> boolList2BinString([True, True, False])
'0b110'
>>> print(boolList2BinString([True, True, False]))
0b110
>>>

*注意:我故意选择使用str.join而不是生成器表达式的列表理解,因为前者是generally faster

答案 1 :(得分:3)

将列表转换为合适的二进制文件(将是一个long int):

number = reduce(lambda a, b: (a<<1) + int(b), [ True, True, False ])

然后,如果你真的需要一个“二进制字符串”,就像你说的那样,使用

bin(number)

生成该字符串。

修改

您也可以使用此代码:

number = sum(int(bit) << position
             for (position, bit) in
             enumerate(reversed([True, True, False])))

它背后的机制与以前一样。

答案 2 :(得分:2)

data = [True, True, False]
print bin(int("".join(str(int(item)) for item in data), 2))
# 0b110

答案 3 :(得分:2)

values = [True,False,False,True]
bin(sum(int(v)*2**i for i,v in enumerate(values[::-1]) ))

实际上

In [7]: %timeit bin(sum(int(v)*2**i for i,v in enumerate(values[::-1]) ))
10000 loops, best of 3: 108 us per loop

In [8]: %timeit '0b' + ''.join(['1' if x else '0' for x in values])
100000 loops, best of 3: 5.25 us per loop

In [9]: %timeit bin(int("".join(str(int(item)) for item in values), 2))
10000 loops, best of 3: 29.5 us per loop

In [10]: %timeit bin(reduce(lambda a, b: (a<<1) + int(b), values))
10000 loops, best of 3: 31.3 us per loop

我的解决方案是最慢的:( ...

相关问题