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

Pyt*_*ast 97 python string int

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

例如: x == 'true' and type(x) == unicode

我想要 x = 1

PS:我不想使用if-else.

Mar*_*ers 143

使用int()一个布尔测试:

x = int(x == 'true')
Run Code Online (Sandbox Code Playgroud)

int()将布尔值转换为10.请注意,任何等于的值'true'都将导致0返回.


Sno*_*att 122

如果B是布尔数组,请写入

B = B*1
Run Code Online (Sandbox Code Playgroud)

有点代码高尔夫球,但我喜欢它.

  • 对于代码高尔夫,也许吧.为了便于阅读,它是'B = map(int,B)`. (12认同)
  • 在 Python 3 中对我不起作用(数组保持布尔值)。但是使用 `numpy.multiply(B,1)` 是有效的。 (3认同)
  • 这完全相同的事情也适用于单个值。这很棒! (2认同)

小智 8

+(False)转换为 0 并 +(True)转换为 1


Abh*_*jit 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
Run Code Online (Sandbox Code Playgroud)

  • 为什么是'TypeError`?如果*string*不包含''true'`或''false',则它是*value*错误.如果输入不是一个字符串,你将获得(99.99%的次数)一个`AttributeError`,因此捕获`ValueError`并将其重新提升为`TypeError`是没用的. (2认同)

Bak*_*riu 7

这是您的问题的另一个解决方案:

def to_bool(s):
    return 1 - sum(map(ord, s)) % 2
    # return 1 - sum(s.encode('ascii')) % 2  # Alternative for Python 3
Run Code Online (Sandbox Code Playgroud)

它的工作原理因为ASCII码的总和'true'就是448,这是偶数,而的ASCII码的总和'false'523这是奇怪的.


关于这个解决方案的有趣之处在于,如果输入不是'true'或者是其中一个,那么它的结果是相当随机的'false'.一半的时间会返回0,另一半1.encode如果输入不是ASCII,则变量using 将引发编码错误(从而增加行为的未定义).


说真的,我相信最可读,更快的解决方案是使用if:

def to_bool(s):
    return 1 if s == 'true' else 0
Run Code Online (Sandbox Code Playgroud)

查看一些微基准测试:

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
Run Code Online (Sandbox Code Playgroud)

请注意该if解决方案至少所有其他解决方案2.5倍.作为要求避免使用s 是没有意义的,除非这是某种功课(在这种情况下你不应该首先问这个).if


sha*_*r_m 7

您可以使用x.astype('uint8')where x是布尔数组。