如何在Python中将false转换为0并将其转换为1

有没有什么办法将true的typesunicode 1和falsetypes的unicode 0(在Python中)?

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

我想要x = 1

PS:我不想用if-else。

在布尔testing中使用int()

 x = int(x == 'true') 

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