在Python中如何将字符串转换为布尔值?以下尝试会返回 True
:
>>> bool("False")
True
实际上,您只需将字符串与您期望接受为表示true的内容进行比较,因此您可以这样做:
s == 'True'
或者检查一堆值:
s.lower() in ['true', '1', 't', 'y', 'yes', 'yeah', 'yup', 'certainly', 'uh-huh']
使用以下内容时请小心:
>>> bool("foo")
True
>>> bool("")
False
空字符串被解释为 False
,但其他所有内容都被解释为 True
。因此,它不适用于任何解析目的。
s == "True"
这个表达式非常简单。但是我曾经看到有些人在这方面搞砸了。下面是一个将字符串转换为布尔值的函数,它保证了正确性:def convert(s): if s == "True": return True; return False. - S.Lottbool("False")
进行强制类型转换。它总是会被转换为 True
。 - Ev.使用:
bool(distutils.util.strtobool(some_string))
distutils.util.strtobool
(将字符串转换为布尔值)distutils.util.strtobool
(将字符串转换为布尔值)真值包括 y、yes、t、true、on 和 1;假值包括 n、no、f、false、off 和 0。如果 val 是其他值,则会引发 ValueError。
请注意,distutils.util.strtobool()
返回整数表示形式,因此需要使用 bool()
进行包装以获取布尔值。
鉴于distutils将不再是标准库的一部分,这里提供了distutils.util.strtobool()
的代码(请参见3.11.2的源代码)。
def strtobool (val):
"""Convert a string representation of truth to true (1) or false (0).
True values are 'y', 'yes', 't', 'true', 'on', and '1'; false values
are 'n', 'no', 'f', 'false', 'off', and '0'. Raises ValueError if
'val' is anything else.
"""
val = val.lower()
if val in ('y', 'yes', 't', 'true', 'on', '1'):
return 1
elif val in ('n', 'no', 'f', 'false', 'off', '0'):
return 0
else:
raise ValueError("invalid truth value %r" % (val,))
None
和str(None)
作为输入,那就完美了。 - MarkHuif x == False
这样的不好的操作,就没有必要使用实际的布尔值而不是 1
/0
。如果你正在处理整数和 None,则不需要特殊函数,只需直接检查它们,如 if myint:
或 if not maybe_none_var:
。 - Anentropicbool
是 int
的一个子类。 - Anentropicdef 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
明确处理真和假:
你也可以让你的函数明确地检查一个真单词列表和一个假单词列表。如果它既不在真单词列表中,也不在假单词列表中,那么你可以抛出一个异常。
JSON解析器还可以将字符串转换为Python中合理的类型,这在一般情况下同样很有用。
>>> import json
>>> json.loads("false".lower())
False
>>> json.loads("True".lower())
True
json.loads("[42]".lower()) -> [42]
- selle.lower()
?当我不使用它时,例如 x = "False"
j = json.loads(x)
,我会收到错误消息 json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
。 - Ambassador Koshtrue
和 false
值;请参阅 https://json-schema.org/understanding-json-schema/reference/boolean.html。 - Luisast.literal_eval
,并且它仍然可在 Python 3 中使用。None
和Ellipsis
。eval()
不同,它专门设计为不执行Python代码。没有命名空间、名称查找或调用能力。但是,它并不是免受攻击的:相对较小的输入可能会导致内存耗尽或C堆栈耗尽,从而使进程崩溃。某些输入还可能导致过度CPU消耗拒绝服务。因此,不建议在不受信任的数据上调用它。"True"
或"False"
,这似乎可以工作:>>> ast.literal_eval("True")
True
>>> ast.literal_eval("False")
False
>>> ast.literal_eval("F")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/opt/Python-2.6.1/lib/python2.6/ast.py", line 68, in literal_eval
return _convert(node_or_string)
File "/opt/Python-2.6.1/lib/python2.6/ast.py", line 67, in _convert
raise ValueError('malformed string')
ValueError: malformed string
>>> ast.literal_eval("'False'")
'False'
我通常不会推荐这样做,但它是完全内置的,根据您的需求可能是合适的选择。
不过解决方法很简单,只需使用 ast.literal_eval(to_test.title()) 即可。 - Bhushanast.literal_eval('true')或ast.literal_eval('TRUE') 会引发错误raise ValueError('malformed string')
如果您知道字符串将是"True"
或"False"
之一,那么您可以直接使用eval(s)
。
>>> eval("True")
True
>>> eval("False")
False
只有在您确信字符串内容时才使用它,因为如果字符串不包含有效的 Python 代码,它将引发异常,并且将执行字符串中包含的代码。
eval
?虽然你永远无法百分之百确定一段代码会在未来保持相同的行为,但如果你坚持使用 eval
,那么灾难或许就近在眼前。 - slajma注意: 永远不要使用 eval()
直接或间接地从用户那里接受输入,因为它容易被滥用:
eval('os.system(‘rm -rf /’)')
但是好消息是,研究也发现,eval()
并不是邪恶的,对于可信代码来说,完全可以使用。你可以使用它将布尔字符串(例如 "False"
和 "True"
)转换为布尔类型。
我想分享一下我的简单解决方案:使用 eval()
。如果字符串完全符合标题格式 True
或 False
(始终以首字母大写开头),它将把字符串转换为正确的布尔类型;否则该函数将引发错误。
例如:
>>> 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
eval('os.system(‘rm -rf /’)')
并删除该目录中的所有文件。然而,对于可信代码来说,eval()
是完全可以接受的,它并不是真正的邪恶。所以我最好写个注意事项提醒大家小心使用。 - Shift 'n Tabliteral_eval
怎么样? - Nishantpydantic >=2
:from pydantic import TypeAdapter
>>> TypeAdapter(bool).validate_python("true")
True
>>> TypeAdapter(bool).validate_python("off")
False
pydantic <2
版本:
import pydantic
>>> pydantic.parse_obj_as(bool, "true")
True
>>> pydantic.parse_obj_as(bool, "off")
False
这个版本保留了像 int(value) 这样的构造函数的语义,并提供了一种定义可接受字符串值的简单方法。
valid = {'true': True, 't': True, '1': True,
'false': False, 'f': False, '0': False,
}
def to_bool(value):
"""Convert string value to boolean."""
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
valid
的定义应该放在函数外面,否则dict
将在每次调用时重新构建,从而消除了使用dict
的大部分性能优势。 - ShadowRanger你可以像这样做:
my_string = "false"
val = (my_string == "true")
括号中的位将求值为False
。这只是在不必进行实际函数调用的情况下执行它的另一种方式。
val = "false"
行是在做什么?它为什么在那里?它是什么意思? - S.Lott
bool("string")
时,它总是返回True
...除了空字符串bool("")
。 - FiddleStix