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


118

有没有一种方法可以将true类型转换unicode为1并将false类型转换unicode为0(在Python中)?

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

我想要 x = 1

PS:我不想使用if- else

Answers:


164

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

x = int(x == 'true')

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


这是一个很好的答案,除了所有没有'true'的东西都被解释为'0'。不知道这是否符合OP的要求。
阿比吉特(Abhijit)2013年

尽管这可能是OP想要的,但它与python 2.7所要求的问题并不完全匹配。他们明确要求它在unicode类型上工作,但未指定type的行为str
2013年

1
@wim实际上,这个问题从未提及python版本,更不用说它应该是python2了。7。另请注意,在python2中u'true' == 'true',该函数的行为与输入类型[ str和之间unicode] 无关。
巴库里

但是Bakuriu,这正是我的观点,“问题”是u'true' == 'true',我们不知道用例是什么。也许他们希望针对这种情况采取不同的行为type(x) != unicode
2013年

1
@AlbertChen:不,因为numpy数组广播比较,并且不产生布尔值。相反,比较会产生布尔值数组。我不确定您从arrayvalue == 'true'比较中期望什么,我在这里回答的问题特定于字符串(unicode)值。
马丁·彼得斯

136

如果B是布尔数组,则写

B = B*1

(一些代码golfy。)


1
这完全相同的事情也适用于单个值。这很棒!
user31415

2
在Python 3中对我不起作用(数组保持布尔值)。但是使用numpy.multiply(B,1)作品。
Alaa M.

这在python 3中对我有用!如此出色的解决方案。哦,我的
alwaysaskingquestions,

@Ourobours:尝试遵循您的建议对我没有用,虽然原始的Sulotion给出了一个不错的可行的结果B=map(int,B),但为我返回了Python 3中的地图对象。
Eulenfuchswiesel

1
@Eulenfuchswiesel这是因为map在Python3中返回了迭代器。要将其用作列表,请将其像这样转换为列表:B = list(map(int(B,B))
Gigi Bayte

11

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


9

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

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

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


关于此解决方案的有趣之处在于,如果输入不是'true' or 之一,则其结果是非常随机的'false'。一半的时间会回来0,另一半1encode如果输入不是ASCII ,变体using 将引发编码错误(从而增加行为的不确定性)。


认真地说,我认为最易读,更快捷的解决方案是使用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解决办法是至少 2.5倍速度所有其他解决方案。避免使用s 是没有意义的,if除非这是某种家庭作业(在这种情况下,您本来不应该首先问这个问题)。


7

如果您需要从本身不是布尔值的字符串进行通用转换,则最好编写类似于以下所示的例程。秉承鸭子打字的精神,我没有默默地传递错误,而是将其转换为适合当前情况的错误。

>>> 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

2
为什么这样TypeError?如果字符串不包含'true'或者'false'它是一个误差。如果输入的不是字符串,则将得到(99.99%的时间)一个AttributeError,因此捕获ValueError并重新将其提升为没用TypeError
Bakuriu 2013年

@Bakuriu:我同意。TypeError确实不适用于此处。
阿比吉特(Abhijit)2013年

@Bakuriu:出于好奇,您能举一个index引发AttributeError 的例子吗?
乔治,2013年

@Bakuriu:我想我是在指您下面的帖子:return ['false', 'true'].index(s) except (ValueError, AttributeError)
乔治,

@ thg435在那篇文章中,我只是复制粘贴并决定删除该lower()调用,因为这是唯一执行此额外计算的解决方案,并且将其包含在微基准测试中并不是正确的。即使try...except需要一点时间也可以,但是如果没有异常(相差不大),则差异很小20ns
Bakuriu

0

布尔到整数: x = (x == 'true') + 0

现在x包含1,x == 'true'否则为0。

注意:x == 'true'将返回bool,然后将其与0一起转换为具有值(如果bool值为True则为1,否则为0)的int类型。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.