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

geo*_*tle 1 python binary boolean list

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

例如boolList2BinString([True,True,False])='0b110'.

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

例如boolList2Bin([True,True,False])= 0b110.

谢谢!

iCo*_*dez 8

关于第一个问题,您可以使用列表理解*和条件表达式:

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

关于你的第二个,你不能"将二进制字符串转换为二进制文字".顾名思义,文字必须按字面输入:

>>> x = 0b110
>>>
Run Code Online (Sandbox Code Playgroud)

也许你的意思是你想要从输出中删除引号?如果是这样,请使用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
>>>
Run Code Online (Sandbox Code Playgroud)

*注意:我故意选择使用列表推导str.join而不是生成器表达式,因为前者通常更快.

  • @Alfe - 你没有_need_带有`str.join`的列表你是对的.但我在答案中给出的链接表明,使用它的速度通常更快.另外,如果你使用[`timeit.timeit`](http://docs.python.org/3/library/timeit.html#timeit.timeit),你会发现条件表达式比''01略快"[X]`. (2认同)

Alf*_*lfe 6

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

number = reduce(lambda a, b: (a<<1) + int(b), [ True, True, False ])
Run Code Online (Sandbox Code Playgroud)

然后,如果您确实需要一个“二进制字符串”,正如您所说,请使用

bin(number)
Run Code Online (Sandbox Code Playgroud)

生成该字符串。

编辑

您还可以使用此代码:

number = sum(int(bit) << position
             for (position, bit) in
             enumerate(reversed([True, True, False])))
Run Code Online (Sandbox Code Playgroud)

其背后的机制与之前相同。

  • 在 Python 3+ `reduce` 中,我们转移到 [`functools`](https://docs.python.org/3.5/library/functools.html#functools.reduce) 模块。 (2认同)