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

5 投票
5 回答
10949 浏览
提问于 2025-04-17 20:19

在Python中,把一堆布尔值(也就是True和False)转换成二进制字符串的最快方法是什么呢?

比如说,如果你有一个布尔值列表[True, True, False],你想把它变成'0b110'这样的二进制字符串。

另外,我该怎么把这个二进制字符串转换成二进制字面量呢?这样做会比直接从布尔值列表转换成二进制字面量要花更多时间吗?具体应该怎么做呢?

比如说,boolList2Bin([True, True, False]) = 0b110。

谢谢!

5 个回答

0
L = [True, False, True]
''.join(map(str, map(int, L))) # '101'. 

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

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

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

4

这段内容是关于编程问题的讨论,主要涉及一些技术细节和解决方案。它可能包含了代码示例和一些建议,帮助开发者解决特定的编程难题。

在这个讨论中,大家分享了自己的经验和看法,提供了不同的解决方法。对于初学者来说,可以从中学习到如何处理类似的问题,以及在编程过程中可能遇到的各种情况。

总的来说,这里是一个互相帮助的地方,大家都在努力让编程变得更简单、更易懂。

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

把这个列表转换成一个合适的二进制数(会是一个长整型):

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])))

它背后的原理和之前的是一样的。

10

关于你的第一个问题,你可以使用一种叫做列表推导式*和一种叫做条件表达式的方法:

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

至于你的第二个问题,你不能把“那个二进制字符串转换成二进制字面量”。正如它们的名字所示,字面量必须是字面上输入的

>>> 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,而不是生成器表达式,因为前者通常更快

撰写回答