Answers:
使用int()
一个布尔测试:
x = int(x == 'true')
int()
将布尔值转换为1
或0
。请注意,任何不等于的值'true'
都将导致0
返回。
str
。
u'true' == 'true'
,该函数的行为与输入类型[ str
和之间unicode
] 无关。
u'true' == 'true'
,我们不知道用例是什么。也许他们希望针对这种情况采取不同的行为type(x) != unicode
。
如果B
是布尔数组,则写
B = B*1
(一些代码golfy。)
numpy.multiply(B,1)
作品。
B=map(int,B)
,但为我返回了Python 3中的地图对象。
这是您的问题的另一种解决方案:
def to_bool(s):
return 1 - sum(map(ord, s)) % 2
# return 1 - sum(s.encode('ascii')) % 2 # Alternative for Python 3
它的工作原理因为ASCII码的总和'true'
就是448
,这是偶数,而的ASCII码的总和'false'
就是523
这是奇怪的。
关于此解决方案的有趣之处在于,如果输入不是'true'
or 之一,则其结果是非常随机的'false'
。一半的时间会回来0
,另一半1
。encode
如果输入不是ASCII ,变体using 将引发编码错误(从而增加行为的不确定性)。
认真地说,我认为最易读,更快捷的解决方案是使用if
:
def to_bool(s):
return 1 if s == 'true' else 0
查看一些微基准测试:
In [14]: def most_readable(s):
...: return 1 if s == 'true' else 0
In [15]: def int_cast(s):
...: return int(s == 'true')
In [16]: def str2bool(s):
...: try:
...: return ['false', 'true'].index(s)
...: except (ValueError, AttributeError):
...: raise ValueError()
In [17]: def str2bool2(s):
...: try:
...: return ('false', 'true').index(s)
...: except (ValueError, AttributeError):
...: raise ValueError()
In [18]: def to_bool(s):
...: return 1 - sum(s.encode('ascii')) % 2
In [19]: %timeit most_readable('true')
10000000 loops, best of 3: 112 ns per loop
In [20]: %timeit most_readable('false')
10000000 loops, best of 3: 109 ns per loop
In [21]: %timeit int_cast('true')
1000000 loops, best of 3: 259 ns per loop
In [22]: %timeit int_cast('false')
1000000 loops, best of 3: 262 ns per loop
In [23]: %timeit str2bool('true')
1000000 loops, best of 3: 343 ns per loop
In [24]: %timeit str2bool('false')
1000000 loops, best of 3: 325 ns per loop
In [25]: %timeit str2bool2('true')
1000000 loops, best of 3: 295 ns per loop
In [26]: %timeit str2bool2('false')
1000000 loops, best of 3: 277 ns per loop
In [27]: %timeit to_bool('true')
1000000 loops, best of 3: 607 ns per loop
In [28]: %timeit to_bool('false')
1000000 loops, best of 3: 612 ns per loop
请注意该怎么if
解决办法是至少 2.5倍倍速度比所有其他解决方案。避免使用s 是没有意义的,if
除非这是某种家庭作业(在这种情况下,您本来不应该首先问这个问题)。
如果您需要从本身不是布尔值的字符串进行通用转换,则最好编写类似于以下所示的例程。秉承鸭子打字的精神,我没有默默地传递错误,而是将其转换为适合当前情况的错误。
>>> def str2bool(st):
try:
return ['false', 'true'].index(st.lower())
except (ValueError, AttributeError):
raise ValueError('no Valid Conversion Possible')
>>> str2bool('garbaze')
Traceback (most recent call last):
File "<pyshell#106>", line 1, in <module>
str2bool('garbaze')
File "<pyshell#105>", line 5, in str2bool
raise TypeError('no Valid COnversion Possible')
TypeError: no Valid Conversion Possible
>>> str2bool('false')
0
>>> str2bool('True')
1
TypeError
?如果字符串不包含'true'
或者'false'
它是一个值误差。如果输入的不是字符串,则将得到(99.99%的时间)一个AttributeError
,因此捕获ValueError
并重新将其提升为没用TypeError
。
index
引发AttributeError 的例子吗?
return ['false', 'true'].index(s) except (ValueError, AttributeError)
。
lower()
调用,因为这是唯一执行此额外计算的解决方案,并且将其包含在微基准测试中并不是正确的。即使try...except
需要一点时间也可以,但是如果没有异常(相差不大),则差异很小20ns
。
仅与此:
const a = true; const b = false;
console.log(+ a); // 1 console.log(+ b); // 0