如何在python中将'false'转换为0并将'true'转换为1

时间:2013-12-30 13:45:17

标签: python string int

有没有办法将类型true的{​​{1}}转换为类型unicode的1和false为0(在python中)?

例如:unicode

我想要x == 'true' and type(x) == unicode

PS:我不想使用if-else。

11 个答案:

答案 0 :(得分:121)

在布尔测试中使用int()

x = int(x == 'true')

int()将布尔值变为10。请注意,等于'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