1002

有谁知道如何在 Python 中将字符串转换为布尔值?我找到了这个链接。但这看起来不是正确的方法。即使用内置功能等。

我问这个的原因是因为我int("string")从这里了解到。但是在尝试时bool("string")它总是返回True

>>> bool("False")
True
4

33 回答 33

1077

真的,您只需将字符串与您期望接受的表示 true 的字符串进行比较,因此您可以这样做:

s == 'True'

或者检查一大堆值:

s.lower() in ['true', '1', 't', 'y', 'yes', 'yeah', 'yup', 'certainly', 'uh-huh']

使用以下内容时要小心:

>>> bool("foo")
True
>>> bool("")
False

空字符串评估为False,但其他所有字符串评估为True。所以这不应该用于任何类型的解析目的。

于 2009-04-03T19:52:56.183 回答
482

采用:

bool(distutils.util.strtobool(some_string))

真值为 y、yes、t、true、on 和 1;false 值为 n、no、f、false、off 和 0。如果 val 是其他值,则引发 ValueError。

请注意,它distutils.util.strtobool()返回整数表示,因此需要将其包装起来bool()以获取布尔值。

于 2013-08-27T17:42:22.040 回答
309
def str2bool(v):
  return v.lower() in ("yes", "true", "t", "1")

然后像这样调用它:

>>> str2bool("yes")
True
>>> str2bool("no")
False
>>> str2bool("stuff")
False
>>> str2bool("1")
True
>>> str2bool("0")
False

明确处理真假:

您还可以使您的函数显式检查 True 单词列表和 False 单词列表。然后,如果它不在两个列表中,则可以抛出异常。

于 2009-04-03T19:56:44.100 回答
158

JSON 解析器通常也可用于将字符串转换为合理的 Python 类型。

>>> import json
>>> json.loads("false".lower())
False
>>> json.loads("True".lower())
True
于 2012-12-04T15:38:14.847 回答
121

从 Python 2.6 开始,现在有ast.literal_eval

>>> 导入 ast
>>> 帮助(ast.literal_eval)
关于 ast 模块中函数 literal_eval 的帮助:

文字评估(节点或字符串)
    安全地评估表达式节点或包含 Python 的字符串
    表达。提供的字符串或节点只能包含以下内容
    Python 文字结构:字符串、数字、元组、列表、字典、布尔值、
    和无。

这似乎可行,只要您确定您的字符串将是"True"or "False"

>>> ast.literal_eval("真")
真的
>>> ast.literal_eval("False")
错误的
>>> ast.literal_eval("F")
回溯(最近一次通话最后):
  文件“”,第 1 行,在
  文件“/opt/Python-2.6.1/lib/python2.6/ast.py”,第 68 行,在 literal_eval 中
    返回 _convert(node_or_string)
  文件“/opt/Python-2.6.1/lib/python2.6/ast.py”,第 67 行,在 _convert
    raise ValueError('格式错误的字符串')
ValueError:格式错误的字符串
>>> ast.literal_eval("'False'")
'错误的'

我通常不会推荐这个,但它是完全内置的,根据您的要求可能是正确的。

于 2009-05-28T18:06:39.923 回答
71

如果您知道字符串将是"True"or "False",则可以使用eval(s).

>>> eval("True")
True
>>> eval("False")
False

仅当您确定字符串的内容时才使用它,因为如果字符串不包含有效的 Python,它将引发异常,并且还将执行字符串中包含的代码。

于 2018-08-22T21:27:55.080 回答
18

此版本保留了 int(value) 等构造函数的语义,并提供了一种简单的方法来定义可接受的字符串值。

def to_bool(value):
    valid = {'true': True, 't': True, '1': True,
             'false': False, 'f': False, '0': False,
             }   

    if isinstance(value, bool):
        return value

    if not isinstance(value, basestring):
        raise ValueError('invalid literal for boolean. Not a string.')

    lower_value = value.lower()
    if lower_value in valid:
        return valid[lower_value]
    else:
        raise ValueError('invalid literal for boolean: "%s"' % value)


# Test cases
assert to_bool('true'), '"true" is True' 
assert to_bool('True'), '"True" is True' 
assert to_bool('TRue'), '"TRue" is True' 
assert to_bool('TRUE'), '"TRUE" is True' 
assert to_bool('T'), '"T" is True' 
assert to_bool('t'), '"t" is True' 
assert to_bool('1'), '"1" is True' 
assert to_bool(True), 'True is True' 
assert to_bool(u'true'), 'unicode "true" is True'

assert to_bool('false') is False, '"false" is False' 
assert to_bool('False') is False, '"False" is False' 
assert to_bool('FAlse') is False, '"FAlse" is False' 
assert to_bool('FALSE') is False, '"FALSE" is False' 
assert to_bool('F') is False, '"F" is False' 
assert to_bool('f') is False, '"f" is False' 
assert to_bool('0') is False, '"0" is False' 
assert to_bool(False) is False, 'False is False'
assert to_bool(u'false') is False, 'unicode "false" is False'

# Expect ValueError to be raised for invalid parameter...
try:
    to_bool('')
    to_bool(12)
    to_bool([])
    to_bool('yes')
    to_bool('FOObar')
except ValueError, e:
    pass
于 2013-09-25T21:16:55.090 回答
16

更新

注意:如果它直接从用户那里获取输入,则永远不要使用eval(),因为它很容易被滥用:

eval('os.system(‘rm -rf /’)')

但是干杯!研究还发现这eval()不是邪恶的,对于受信任的代码来说是完全可以的。您可以使用它来将布尔字符串(例如"False"和)转换"True"为布尔类型。

我想分享我的简单解决方案:使用eval(). 如果字符串完全采用标题格式或始终首字母大写True,则它将字符串转换为正确的布尔类型,否则该函数将引发错误。FalseTrueFalse

例如

>>> eval('False')
False

>>> eval('True')
True

当然,对于动态变量,您可以简单地使用.title()来格式化布尔字符串。

>>> x = 'true'
>>> eval(x.title())
True

这将引发错误。

>>> eval('true')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1, in <module>
NameError: name 'true' is not defined

>>> eval('false')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1, in <module>
NameError: name 'false' is not defined
于 2020-04-21T09:53:44.793 回答
13

这是我的版本。它检查正值和负值列表,引发未知值的异常。它不接收字符串,但任何类型都应该这样做。

def to_bool(value):
    """
       Converts 'something' to boolean. Raises exception for invalid formats
           Possible True  values: 1, True, "1", "TRue", "yes", "y", "t"
           Possible False values: 0, False, None, [], {}, "", "0", "faLse", "no", "n", "f", 0.0, ...
    """
    if str(value).lower() in ("yes", "y", "true",  "t", "1"): return True
    if str(value).lower() in ("no",  "n", "false", "f", "0", "0.0", "", "none", "[]", "{}"): return False
    raise Exception('Invalid value for boolean conversion: ' + str(value))

样品运行:

>>> to_bool(True)
True
>>> to_bool("tRUe")
True
>>> to_bool("1")
True
>>> to_bool(1)
True
>>> to_bool(2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 9, in to_bool
Exception: Invalid value for boolean conversion: 2
>>> to_bool([])
False
>>> to_bool({})
False
>>> to_bool(None)
False
>>> to_bool("Wasssaaaaa")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 9, in to_bool
Exception: Invalid value for boolean conversion: Wasssaaaaa
>>>
于 2012-02-17T18:57:43.370 回答
10

你总是可以做类似的事情

myString = "false"
val = (myString == "true")

括号中的位将评估为 False。这只是另一种无需进行实际函数调用的方法。

于 2009-04-03T19:53:23.203 回答
10

一个很酷的简单技巧(基于@Alan Marchiori 发布的内容),但使用 yaml:

import yaml

parsed = yaml.load("true")
print bool(parsed)

如果这太宽,可以通过测试类型结果来细化。如果 yaml 返回的类型是 str,那么它不能转换为任何其他类型(无论如何我都能想到),所以你可以单独处理它,或者让它成为真的。

我不会对速度做出任何猜测,但是由于无论如何我都是在 Qt gui 下使用 yaml 数据,所以这具有很好的对称性。

于 2013-02-18T22:21:51.763 回答
9

我不同意这里的任何解决方案,因为它们太宽容了。在解析字符串时,这通常不是您想要的。

所以这里是我正在使用的解决方案:

def to_bool(bool_str):
    """Parse the string and return the boolean value encoded or raise an exception"""
    if isinstance(bool_str, basestring) and bool_str: 
        if bool_str.lower() in ['true', 't', '1']: return True
        elif bool_str.lower() in ['false', 'f', '0']: return False

    #if here we couldn't parse it
    raise ValueError("%s is no recognized as a boolean value" % bool_str)

结果:

>>> [to_bool(v) for v in ['true','t','1','F','FALSE','0']]
[True, True, True, False, False, False]
>>> to_bool("")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 8, in to_bool
ValueError: '' is no recognized as a boolean value

为了清楚起见,因为看起来我的回答似乎以某种方式冒犯了某人:

关键是您不想只测试一个值并假设另一个值。我不认为您总是想将 Absolutely 一切都映射到未解析的值。这会产生容易出错的代码。

因此,如果您知道要在其中编写什么代码。

于 2012-11-26T10:04:22.103 回答
7

dict(实际上是 defaultdict)为您提供了一种非常简单的方法来完成此技巧:

from collections import defaultdict
bool_mapping = defaultdict(bool) # Will give you False for non-found values
for val in ['True', 'yes', ...]:
    bool_mapping[val] = True

print(bool_mapping['True']) # True
print(bool_mapping['kitten']) # False

将此方法定制为您想要的确切转换行为真的很容易——您可以用允许的 Truthy 和 Falsy 值填充它,并在未找到值或默认为 True 时让它引发异常(或返回 None),或默认为 False,或任何您想要的。

于 2012-03-16T17:47:14.640 回答
7

我用

# function
def toBool(x):
    return x in ("True","true",True)

# test cases
[[x, toBool(x)] for x in [True,"True","true",False,"False","false",None,1,0,-1,123]]
"""
Result:
[[True, True],
 ['True', True],
 ['true', True],
 [False, False],
 ['False', False],
 ['false', False],
 [None, False],
 [1, True],
 [0, False],
 [-1, False],
 [123, False]]
"""
于 2019-09-17T15:27:37.440 回答
5

您可能已经有了一个解决方案,但对于其他正在寻找一种使用“标准”假值(包括 None、[]、{} 和“”以及 false、no 和 0 )将值转换为布尔值的方法的人来说.

def toBoolean( val ):
    """ 
    Get the boolean value of the provided input.

        If the value is a boolean return the value.
        Otherwise check to see if the value is in 
        ["false", "f", "no", "n", "none", "0", "[]", "{}", "" ]
        and returns True if value is not in the list
    """

    if val is True or val is False:
        return val

    falseItems = ["false", "f", "no", "n", "none", "0", "[]", "{}", "" ]

    return not str( val ).strip().lower() in falseItems
于 2010-01-15T18:13:01.873 回答
5

另一种选择

from ansible.module_utils.parsing.convert_bool import boolean
boolean('no')
# False
boolean('yEs')
# True
boolean('true')
# True
于 2018-10-15T14:23:49.170 回答
4

转换为 bool 的通常规则是一些特殊的文字(False, 0, 0.0, (), [], {})是假的,然后其他一切都是真的,所以我建议如下:

def boolify(val):
    if (isinstance(val, basestring) and bool(val)):
        return not val in ('False', '0', '0.0')
    else:
        return bool(val)
于 2009-07-11T20:45:35.230 回答
4

如果您知道您的输入将是“真”或“假”,那么为什么不使用:

def bool_convert(s):
    return s == "True"
于 2016-03-23T17:39:39.903 回答
3

这是我写的版本。将其他几种解决方案合并为一个。

def to_bool(value):
    """
    Converts 'something' to boolean. Raises exception if it gets a string it doesn't handle.
    Case is ignored for strings. These string values are handled:
      True: 'True', "1", "TRue", "yes", "y", "t"
      False: "", "0", "faLse", "no", "n", "f"
    Non-string values are passed to bool.
    """
    if type(value) == type(''):
        if value.lower() in ("yes", "y", "true",  "t", "1"):
            return True
        if value.lower() in ("no",  "n", "false", "f", "0", ""):
            return False
        raise Exception('Invalid value for boolean conversion: ' + value)
    return bool(value)

如果它得到一个字符串,它需要特定的值,否则引发异常。如果它没有得到一个字符串,就让 bool 构造函数找出它。测试了这些案例:

test_cases = [
    ('true', True),
    ('t', True),
    ('yes', True),
    ('y', True),
    ('1', True),
    ('false', False),
    ('f', False),
    ('no', False),
    ('n', False),
    ('0', False),
    ('', False),
    (1, True),
    (0, False),
    (1.0, True),
    (0.0, False),
    ([], False),
    ({}, False),
    ((), False),
    ([1], True),
    ({1:2}, True),
    ((1,), True),
    (None, False),
    (object(), True),
    ]
于 2012-05-14T17:07:45.410 回答
3

如果您可以控制返回true/的实体false,一种选择是让它返回1/0而不是true/ false,那么:

boolean_response = bool(int(response))

处理来自网络的响应的额外转换int,这些响应始终是字符串。

2021 年更新:“它们总是字符串”——这是一个幼稚的观察。这取决于库使用的序列化协议。高级库(大多数 Web 开发人员使用的库)的默认序列化通常是在序列化为字节之前转换为字符串。然后另一方面,它从字节反序列化为字符串,因此您丢失了任何类型信息。

于 2018-07-23T17:12:47.873 回答
3

如果你喜欢我,只需要来自字符串的变量的布尔值。您可以使用 @jzwiener 前面提到的 distils。但是我无法按照他的建议导入和使用该模块。

相反,我最终在 python3.7 上以这种方式使用它

distutils 字符串在 python 中为 bool

from distutils import util # to handle str to bool conversion
enable_deletion = 'False'
enable_deletion = bool(util.strtobool(enable_deletion))

distutils 是 python std lib 的一部分,因此无需安装。太棒了!

于 2019-06-13T06:46:00.253 回答
3

您还可以评估任何字符串文字:

import ast
ast.literal_eval('True')  # True
type(ast.literal_eval('True'))  # <class 'bool'>


ls = '[1, 2, 3]'
ast.literal_eval(ls)  # [1, 2, 3]
type(ast.literal_eval(ls))  # <class 'list'>
于 2021-06-21T10:48:45.350 回答
2

我完全同意@Jacob\ Gabrielson 的解决方案,但事情ast.literal_eval只适用于字符串值,True而不False适用于trueor false。所以你只需要使用.title()它来工作

import ast
ast.literal_eval("false".title())
# or
ast.literal_eval("False".title())
于 2021-10-19T13:47:22.503 回答
2

通过使用下面的简单逻辑,您可以将字符串 a = 'true' 或 'false' 转换为布尔值。

a = a.lower() == 'true'

如果 a == 'true' 那么这将设置 a=True 并且如果 a == 'false' 然后 a=False。

于 2021-12-02T16:02:34.253 回答
1

我喜欢为此使用三元运算符,因为对于感觉不应该超过 1 行的东西来说,它更简洁一些。

True if myString=="True" else False
于 2012-08-01T13:07:39.643 回答
1

我意识到这是一篇旧文章,但有些解决方案需要相当多的代码,这就是我最终使用的:

def str2bool(value):
    return {"True": True, "true": True}.get(value, False)
于 2013-08-09T21:37:50.293 回答
1

使用包str2bool pip install str2bool

于 2019-02-20T12:59:49.667 回答
1

我还被要求将输入更改bool为函数,而主要输入仅为TrueFalsein string。所以,我只是这样编码:

def string_to_bool(s):
    bool_flag = True
    if s == "False":
        bool_flag = False
    elif s == "True":
        bool_flag = True
    else:
        print("Invalid Input")
    return bool_flag

您还可以检查它以获取更短的TrueFalse喜欢Y/Ny/n

于 2021-05-26T17:37:10.047 回答
0

这是一个毛茸茸的内置方法,可以得到许多相同的答案。请注意,尽管 python 认为""是 false 并且所有其他字符串都是 true,但 TCL 对事物的想法却截然不同。

>>> import Tkinter
>>> tk = Tkinter.Tk()
>>> var = Tkinter.BooleanVar(tk)
>>> var.set("false")
>>> var.get()
False
>>> var.set("1")
>>> var.get()
True
>>> var.set("[exec 'rm -r /']")
>>> var.get()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.5/lib-tk/Tkinter.py", line 324, in get
    return self._tk.getboolean(self._tk.globalgetvar(self._name))
_tkinter.TclError: 0expected boolean value but got "[exec 'rm -r /']"
>>> 

这样做的好处是它对您可以使用的值相当宽容。将字符串转换为值是懒惰的,它接受和拒绝什么是卫生的(请注意,如果在 tcl 提示符下给出上述语句,它将擦除用户硬盘)。

不好的是它要求 Tkinter 可用,这通常但并非普遍正确,更重要的是,它需要创建一个相对较重的 Tk 实例。

什么被认为是真或假取决于 的行为Tcl_GetBoolean,它认为0falsenooff是假的并且1trueyeson是真的,不区分大小写。任何其他字符串,包括空字符串,都会导致异常。

于 2009-07-11T21:31:45.480 回答
0
def str2bool(str):
  if isinstance(str, basestring) and str.lower() in ['0','false','no']:
    return False
  else:
    return bool(str)

想法:检查您是否希望将字符串评估为 False;否则 bool() 对任何非空字符串返回 True。

于 2010-04-29T11:01:15.643 回答
0

这是我汇总的一些东西来评估字符串的真实性:

def as_bool(val):
 if val:
  try:
   if not int(val): val=False
  except: pass
  try:
   if val.lower()=="false": val=False
  except: pass
 return bool(val)

或多或少与使用相同的结果,eval但更安全。

于 2012-01-29T08:09:54.540 回答
0

我只需要这样做......所以聚会可能迟到了 - 但有人可能会觉得它很有用

def str_to_bool(input, default):
    """
    | Default | not_default_str | input   | result
    | T       |  "false"        | "true"  |  T
    | T       |  "false"        | "false" |  F
    | F       |  "true"         | "true"  |  T
    | F       |  "true"         | "false" |  F

    """
    if default:
        not_default_str = "false"
    else:
        not_default_str = "true"

    if input.lower() == not_default_str:
        return not default
    else:
        return default
于 2016-11-03T01:03:09.847 回答
-8

通过使用 Python 的内置eval()函数和.capitalize()方法,您可以将任何“true”/“false”字符串(无论首字母大写如何)转换为真正的 Python 布尔值。

例如:

true_false = "trUE"
type(true_false)

# OUTPUT: <type 'str'>

true_false = eval(true_false.capitalize())
type(true_false)

# OUTPUT: <type 'bool'>
于 2017-11-22T15:22:23.840 回答