Python:布尔列表转二进制字符串
在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
,而不是生成器表达式,因为前者通常更快。