如何在Python中将false转换为0并将其转换为1
有没有什么办法将true
的typesunicode
1和false
types的unicode
0(在Python中)?
例如: x == 'true' and type(x) == unicode
我想要x = 1
PS:我不想用if-else。
在布尔testing中使用int()
:
x = int(x == 'true')
int()
将布尔值转换为1
或0
。 请注意,任何不等于'true'
都会导致返回0
。
超级简单:
如果B
是一个布尔数组,写
B=B*1
这是我平常的把戏。
如果你需要从一个本身不是bool的string进行通用转换,你最好写一个类似于下面描述的例程。 本着鸭子打字的精神,我并没有默默地通过这个错误,而是根据当前的情况进行了适当的转换。
>>> 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
这是您的问题的另一个解决scheme:
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
,这是奇数。
这个解决scheme的有趣之处在于,如果input不是 'true'
或'false'
,结果是非常随机'false'
。 有一半的时间会返回0
,另一半是1
。 如果input不是ASCII,则使用encode
的变体将引发编码错误(从而增加行为的未定义性)。
说真的,我认为最可读, 更快的解决scheme是使用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
解决scheme的速度至less比所有其他解决scheme快 2.5倍。 作为一种要求避免使用的要求是没有意义的,除非这是某种作业(在这种情况下,你不应该首先问这个问题)。
你也可以使用strtobool
:
In [1]: import distutils In [2]: distutils.util.strtobool("false") Out[2]: 0 In [3]: distutils.util.strtobool("true") Out[3]: 1
我使用转换everywere布尔整数:
>>> x = 'I am a non-empty text' >>> int(bool(x)) 1 >>> x = '' # This is a empty text >>> int(bool(x)) 0 >>> x = True >>> int(bool(x)) 1 >>> x = False >>> int(bool(x)) 0
bool int: x = (x == 'true') + 0
现在x包含1,如果x == 'true'
true'else 0。
注意: x == 'true'
将会返回bool,然后当被添加0时,它将被types化为具有值的int(1,如果bool值为True else 0)。
我用:
>>> str(bool(0)) 'False' >>> str(bool(1)) 'True'