有谁知道如何在Python中将字符串转换为布尔值?我找到了this link。但它看起来不是一个正确的方法。即使用内置功能等
我问这个的原因是因为我从这里学到了int("string")
。我尝试bool("string")
,但总是True
。
>>> bool("False")
True
答案 0 :(得分:676)
实际上,您只需将字符串与您希望接受的任何字符串进行比较即可,因此您可以这样做:
s == 'True'
或者检查一大堆价值观:
s in ['true', '1', 't', 'y', 'yes', 'yeah', 'yup', 'certainly', 'uh-huh']
使用以下内容时要小心:
>>> bool("foo")
True
>>> bool("")
False
空字符串计算结果为False
,但其他所有内容的计算结果为True
。所以这不应该用于任何解析目的。
答案 1 :(得分:233)
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列表和错误的单词列表。然后,如果它不在两个列表中,您可以抛出异常。
答案 2 :(得分:212)
只需使用:
distutils.util.strtobool(some_string)
http://docs.python.org/2/distutils/apiref.html?highlight=distutils.util#distutils.util.strtobool
真值是y,yes,t,true,on和1;假值为n,no,f,false,off和0.如果val为其他值,则引发ValueError。
答案 3 :(得分:103)
从Python 2.6开始,现在有ast.literal_eval
:
>>> import ast >>> help(ast.literal_eval) Help on function literal_eval in module ast: literal_eval(node_or_string) Safely evaluate an expression node or a string containing a Python expression. The string or node provided may only consist of the following Python literal structures: strings, numbers, tuples, lists, dicts, booleans, and None.
这似乎有效,只要您确定,您的字符串将是"True"
或"False"
:
>>> ast.literal_eval("True") True >>> ast.literal_eval("False") False >>> ast.literal_eval("F") Traceback (most recent call last): File "", line 1, in 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'
我通常不建议这样做,但它完全是内置的,根据您的要求可能是正确的。
答案 4 :(得分:88)
JSON解析器通常也可用于将字符串转换为合理的python类型。
>>> import json
>>> json.loads("false".lower())
False
>>> json.loads("True".lower())
True
答案 5 :(得分:15)
如果您知道字符串是"True"
或"False"
,则可以只使用eval(s)
。
>>> eval("True")
True
>>> eval("False")
False
不过,只有在确定字符串的内容时才使用它,因为如果字符串不包含有效的Python,它将引发异常,并且还将执行字符串中包含的代码。
答案 6 :(得分:14)
此版本保留了构造函数的语义,如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
答案 7 :(得分:12)
这是我的版本。它检查正值和负值列表,引发未知值的异常。并且它没有收到字符串,但任何类型都应该这样做。
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
>>>
答案 8 :(得分:11)
更新
注意::如果因为它很容易受到滥用而直接从用户那里获取输入,请不要使用
eval()
:
eval('os.system(‘rm -rf /’)')
但是欢呼!研究还发现
eval()
不是邪恶的,对于Trusted CODE来说完全可以。您可以使用它将布尔型字符串(例如"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
答案 9 :(得分:10)
你可以随时做点什么
myString = "false"
val = (myString == "true")
pare中的位将评估为False。这只是另一种方法,无需进行实际的函数调用。
答案 10 :(得分:8)
一个很酷的简单技巧(基于@Alan Marchiori发布的内容),但是使用了yaml:
import yaml
parsed = yaml.load("true")
print bool(parsed)
如果这个太宽,可以通过测试类型结果来改进它。如果yaml返回的类型是str,那么它不能转换为任何其他类型(无论如何我都能想到),所以你可以单独处理它,或者只是让它成为真。
我不会对速度做任何猜测,但是因为我正在使用Qt gui下的yaml数据,所以它具有很好的对称性。
答案 11 :(得分:7)
您只需使用内置函数eval():
a='True'
if a is True:
print 'a is True, a type is', type(a)
else:
print "a isn't True, a type is", type(a)
b = eval(a)
if b is True:
print 'b is True, b type is', type(b)
else:
print "b isn't True, b type is", type(b)
和输出:
a isn't True, a type is <type 'str'>
b is True, b type is <type 'bool'>
答案 12 :(得分:7)
我不同意这里的任何解决方案,因为它们过于宽松。解析字符串时,这通常不是您想要的。
所以这里是我正在使用的解决方案:
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
只是要清楚,因为看起来好像我的答案以某种方式冒犯了某人:
关键是你不想只测试一个值并假设另一个值。我不认为你总是想把所有的东西都映射到非解析的值。这会产生容易出错的代码。
所以,如果你知道你想要代码的话。
答案 13 :(得分:5)
dict(真的,一个默认的dict)为你提供了一个非常简单的方法来实现这个技巧:
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值填充它,并在找不到值时让它引发异常(或返回None),或者默认值为True,或默认为False,或任何你想要的。
答案 14 :(得分: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
答案 15 :(得分:4)
还有另一个选择
from ansible.module_utils.parsing.convert_bool import boolean
boolean('no')
# False
boolean('yEs')
# True
boolean('true')
# True
但是在生产中,如果不需要ansible及其所有依赖关系,一个好主意是查看其source code并复制所需逻辑的一部分。
答案 16 :(得分:3)
我意识到这是一篇旧帖子,但有些解决方案需要相当多的代码,这就是我最终使用的内容:
def str2bool(value):
return {"True": True, "true": True}.get(value, False)
答案 17 :(得分: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),
]
答案 18 :(得分:3)
投射到布尔的通常规则是一些特殊的文字(False
,0
,0.0
,()
,[]
,{{ 1}})是假的,然后其他一切都是真的,所以我建议如下:
{}
答案 19 :(得分:2)
我喜欢使用三元运算符,因为对于感觉不应超过1行的东西,它更简洁一些。
True if myString=="True" else False
答案 20 :(得分:2)
如果您知道您的输入将是&#34; True&#34;或&#34;错误&#34;然后为什么不使用:
def bool_convert(s):
return s == "True"
答案 21 :(得分: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
或多或少相同的结果,但更安全。
答案 22 :(得分: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
答案 23 :(得分:0)
如果您控制着返回true
/ false
的实体,则一种选择是让它返回1
/ 0
而不是true
/ false
,然后:
boolean_response = bool(int(response))
对int
的额外强制转换可处理来自网络的响应,该响应始终是字符串。
答案 24 :(得分:0)
def str2bool(str):
if isinstance(str, basestring) and str.lower() in ['0','false','no']:
return False
else:
return bool(str)
idea:检查是否要将字符串计算为False;否则bool()会为任何非空字符串返回True。
答案 25 :(得分:0)
这是一个毛茸茸的,内置的方式来获得许多相同的答案。请注意,虽然python认为""
是假的,而其他所有字符串都是真的,但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
,< strong> off
且 1
为false, true
, yes
< / strong>, on
和 {{1}} 为真,不区分大小写。任何其他字符串(包括空字符串)都会导致异常。
答案 26 :(得分:0)
使用软件包str2bool pip install str2bool
答案 27 :(得分:0)
如果您喜欢我,只需要来自字符串的变量中的布尔值即可。您可以使用@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的一部分,因此无需安装。太好了!?
答案 28 :(得分:0)
在Python中搜索三元运算符时,我只是found this个简单的解决方案:
(False, True)[val == "true"]
之所以有效,是因为在Python中True = 1和False = 0,并且一旦评估了比较结果,就将结果用于通过其索引0或1从元组中获取项目。 缺点是它会为除“ true”以外的任何内容返回False,但对于我的环境变量解析方案来说效果很好。
答案 29 :(得分:0)
我用
# 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]]
"""
答案 30 :(得分:0)
我还需要将函数的输入更改为 bool
,而主输入仅为 True
中的 False
或 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
等
答案 31 :(得分:0)
您还可以计算任何字符串文字:
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'>
答案 32 :(得分:-5)
通过使用Python的内置eval()
函数和.capitalize()
方法,您可以转换任何&#34; true&#34; /&#34; false&#34;字符串(无论初始大小写)到真正的Python布尔值。
例如:
true_false = "trUE"
type(true_false)
# OUTPUT: <type 'str'>
true_false = eval(true_false.capitalize())
type(true_false)
# OUTPUT: <type 'bool'>