在python中将布尔列表转换为二进制字符串的最快方法是什么?
e.g。 boolList2BinString([True,True,False])='0b110'。
另外,我如何将二进制字符串转换为二进制文字?这会花费更多的时间,而不仅仅是从布尔列表转换为二进制文字immediatley吗?如何做到这一点?
e.g。 boolList2Bin([True,True,False])= 0b110。
谢谢!
答案 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
我的解决方案是最慢的:( ...