有谁知道如何在 Python 中将字符串转换为布尔值?我找到了这个链接。但这看起来不是正确的方法。即使用内置功能等。
我问这个的原因是因为我int("string")
从这里了解到。但是在尝试时bool("string")
它总是返回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
。所以这不应该用于任何类型的解析目的。
采用:
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()
以获取布尔值。
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 单词列表。然后,如果它不在两个列表中,则可以抛出异常。
JSON 解析器通常也可用于将字符串转换为合理的 Python 类型。
>>> import json
>>> json.loads("false".lower())
False
>>> json.loads("True".lower())
True
从 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'") '错误的'
我通常不会推荐这个,但它是完全内置的,根据您的要求可能是正确的。
如果您知道字符串将是"True"
or "False"
,则可以使用eval(s)
.
>>> eval("True")
True
>>> eval("False")
False
仅当您确定字符串的内容时才使用它,因为如果字符串不包含有效的 Python,它将引发异常,并且还将执行字符串中包含的代码。
此版本保留了 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
更新
注意:如果它直接从用户那里获取输入,则永远不要使用
eval()
,因为它很容易被滥用:
eval('os.system(‘rm -rf /’)')
但是干杯!研究还发现这
eval()
不是邪恶的,对于受信任的代码来说是完全可以的。您可以使用它来将布尔字符串(例如"False"
和)转换"True"
为布尔类型。
我想分享我的简单解决方案:使用eval()
. 如果字符串完全采用标题格式或始终首字母大写True
,则它将字符串转换为正确的布尔类型,否则该函数将引发错误。False
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
这是我的版本。它检查正值和负值列表,引发未知值的异常。它不接收字符串,但任何类型都应该这样做。
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
>>>
你总是可以做类似的事情
myString = "false"
val = (myString == "true")
括号中的位将评估为 False。这只是另一种无需进行实际函数调用的方法。
一个很酷的简单技巧(基于@Alan Marchiori 发布的内容),但使用 yaml:
import yaml
parsed = yaml.load("true")
print bool(parsed)
如果这太宽,可以通过测试类型结果来细化。如果 yaml 返回的类型是 str,那么它不能转换为任何其他类型(无论如何我都能想到),所以你可以单独处理它,或者让它成为真的。
我不会对速度做出任何猜测,但是由于无论如何我都是在 Qt gui 下使用 yaml 数据,所以这具有很好的对称性。
我不同意这里的任何解决方案,因为它们太宽容了。在解析字符串时,这通常不是您想要的。
所以这里是我正在使用的解决方案:
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 一切都映射到未解析的值。这会产生容易出错的代码。
因此,如果您知道要在其中编写什么代码。
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,或任何您想要的。
我用
# 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]]
"""
您可能已经有了一个解决方案,但对于其他正在寻找一种使用“标准”假值(包括 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
另一种选择
from ansible.module_utils.parsing.convert_bool import boolean
boolean('no')
# False
boolean('yEs')
# True
boolean('true')
# True
转换为 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)
如果您知道您的输入将是“真”或“假”,那么为什么不使用:
def bool_convert(s):
return s == "True"
这是我写的版本。将其他几种解决方案合并为一个。
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),
]
如果您可以控制返回true
/的实体false
,一种选择是让它返回1
/0
而不是true
/ false
,那么:
boolean_response = bool(int(response))
处理来自网络的响应的额外转换int
,这些响应始终是字符串。
2021 年更新:“它们总是字符串”——这是一个幼稚的观察。这取决于库使用的序列化协议。高级库(大多数 Web 开发人员使用的库)的默认序列化通常是在序列化为字节之前转换为字符串。然后另一方面,它从字节反序列化为字符串,因此您丢失了任何类型信息。
如果你喜欢我,只需要来自字符串的变量的布尔值。您可以使用 @jzwiener 前面提到的 distils。但是我无法按照他的建议导入和使用该模块。
相反,我最终在 python3.7 上以这种方式使用它
from distutils import util # to handle str to bool conversion
enable_deletion = 'False'
enable_deletion = bool(util.strtobool(enable_deletion))
distutils 是 python std lib 的一部分,因此无需安装。太棒了!
您还可以评估任何字符串文字:
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'>
我完全同意@Jacob\ Gabrielson 的解决方案,但事情ast.literal_eval
只适用于字符串值,True
而不False
适用于true
or false
。所以你只需要使用.title()
它来工作
import ast
ast.literal_eval("false".title())
# or
ast.literal_eval("False".title())
通过使用下面的简单逻辑,您可以将字符串 a = 'true' 或 'false' 转换为布尔值。
a = a.lower() == 'true'
如果 a == 'true' 那么这将设置 a=True 并且如果 a == 'false' 然后 a=False。
我喜欢为此使用三元运算符,因为对于感觉不应该超过 1 行的东西来说,它更简洁一些。
True if myString=="True" else False
我意识到这是一篇旧文章,但有些解决方案需要相当多的代码,这就是我最终使用的:
def str2bool(value):
return {"True": True, "true": True}.get(value, False)
使用包str2bool pip install str2bool
我还被要求将输入更改bool
为函数,而主要输入仅为True
或False
in 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
您还可以检查它以获取更短的True
和False
喜欢Y/N
等y/n
。
这是一个毛茸茸的内置方法,可以得到许多相同的答案。请注意,尽管 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
,它认为0
、false
、no
和off
是假的并且1
、true
、yes
和on
是真的,不区分大小写。任何其他字符串,包括空字符串,都会导致异常。
def str2bool(str):
if isinstance(str, basestring) and str.lower() in ['0','false','no']:
return False
else:
return bool(str)
想法:检查您是否希望将字符串评估为 False;否则 bool() 对任何非空字符串返回 True。
这是我汇总的一些东西来评估字符串的真实性:
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
但更安全。
我只需要这样做......所以聚会可能迟到了 - 但有人可能会觉得它很有用
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
通过使用 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'>