有没有办法将类型true
的{{1}}转换为类型unicode
的1和false
为0(在python中)?
例如:unicode
我想要x == 'true' and type(x) == unicode
PS:我不想使用if-else。
答案 0 :(得分:121)
在布尔测试中使用int()
:
x = int(x == 'true')
int()
将布尔值变为1
或0
。请注意,不等于'true'
的任何值都会导致返回0
。
答案 1 :(得分:110)
如果B
是布尔数组,请写
B=B*1
(有点代码高尔夫)
答案 2 :(得分:7)
如果你需要从一个本身不是bool的字符串进行通用转换,你最好编写一个类似于下面描述的例程。为了保持鸭子打字的精神,我没有默默地传递错误,而是根据当前场景转换它。
>>> 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
答案 3 :(得分:6)
这是您问题的另一个解决方案:
def to_bool(s):
return 1 - sum(map(ord, s)) % 2
# return 1 - sum(s.encode('ascii')) % 2 # alternative for python3
这是有效的,因为'true'
的ASCII码总和是448
,这是偶数,而'false'
的ASCII码之和是523
,这是'true'
奇
这个解决方案的有趣之处在于,如果输入不 'false'
或0
,则其结果非常随机。其中一半时间将返回1
,另一半时间encode
。如果输入不是ASCII,则使用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
注意if
解决方案至少 2.5x 次更快 所有其他方案。 是否有意义避免使用{{1}} s,除非这是某种功课(在这种情况下你不应该首先问这个)
答案 4 :(得分:4)
您可以使用x.astype('uint8')
其中x
是您的布尔数组。
答案 5 :(得分:0)
+(False)
转换为0并
+(True)
转换为1
答案 6 :(得分:0)
以下任何一种都可以:
s = "true"
(s == 'true').real
1
(s == 'false').real
0
(s == 'true').conjugate()
1
(s == '').conjugate()
0
(s == 'true').__int__()
1
(s == 'opal').__int__()
0
def as_int(s):
return (s == 'true').__int__()
>>>> as_int('false')
0
>>>> as_int('true')
1
答案 7 :(得分:-1)
bool to int:
x = (x == 'true') + 0
如果x == 'true'
为其他0,则x包含1。
注意:当{0}添加0时,x == 'true'
将返回bool,然后将其转换为具有值的int(如果bool值为True,则为1,否则为0)。
答案 8 :(得分:-2)
您也可以使用idea --line 3 ~/Test.java
:
strtobool
答案 9 :(得分:-2)
仅与此:
const a = true; const b = false;
console.log(+ a); // 1 console.log(+ b); // 0
答案 10 :(得分:-5)
我用:
get_serializer_context