问题:如何在Python中将’false’转换为0并将’true’转换为1
有没有一种方法可以将true
类型转换unicode
为1并将false
类型转换unicode
为0(在Python中)?
例如: x == 'true' and type(x) == unicode
我想要 x = 1
PS:我不想使用if
– else
。
回答 0
使用int()
一个布尔测试:
x = int(x == 'true')
int()
将布尔值转换为1
或0
。请注意,任何不等于的值'true'
都将导致0
返回。
回答 1
如果B
是布尔数组,则写
B = B*1
(一些代码golfy。)
回答 2
您可以使用x.astype('uint8')
where x
是布尔数组。
回答 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
除非这是某种家庭作业(在这种情况下,您本来不应该首先问这个问题)。
回答 4
如果您需要从本身不是布尔值的字符串进行通用转换,则最好编写类似于以下所示的例程。秉承鸭子打字的精神,我没有默默地传递错误,而是将其转换为适合当前情况的错误。
>>> 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
回答 5
布尔到整数:
x = (x == 'true') + 0
现在x包含1,x == 'true'
否则为0。
注意:x == 'true'
将返回bool,然后将其与0一起转换为具有值(如果bool值为True则为1,否则为0)的int类型。
回答 6
仅与此:
const a = true; const b = false;
console.log(+ a); // 1 console.log(+ b); // 0