Joa*_*nge 653 python string boolean
有没有人知道如何在Python中从字符串转换为布尔值?我找到了这个链接.但它看起来不是一个正确的方法.即使用内置功能等.
我问这个的原因是因为我int("string")从这里学到了.我试过bool("string")但总是得到True.
>>> bool("False")
True
Run Code Online (Sandbox Code Playgroud)
Kei*_*han 745
实际上,您只需将字符串与您希望接受的任何字符串进行比较即可,因此您可以这样做:
s == 'True'
Run Code Online (Sandbox Code Playgroud)
或者检查一大堆值:
s.lower() in ['true', '1', 't', 'y', 'yes', 'yeah', 'yup', 'certainly', 'uh-huh']
Run Code Online (Sandbox Code Playgroud)
使用以下内容时要小心:
>>> bool("foo")
True
>>> bool("")
False
Run Code Online (Sandbox Code Playgroud)
空字符串计算到False,但其他所有内容都计算为True.所以这不应该用于任何类型的解析目的.
Bri*_*ndy 249
def str2bool(v):
return v.lower() in ("yes", "true", "t", "1")
Run Code Online (Sandbox Code Playgroud)
然后像这样调用它:
>>> str2bool("yes")
True
>>> str2bool("no")
False
>>> str2bool("stuff")
False
>>> str2bool("1")
True
>>> str2bool("0")
False
Run Code Online (Sandbox Code Playgroud)
__CODE__
def str2bool(v):
return v.lower() in ("yes", "true", "t", "1")
Run Code Online (Sandbox Code Playgroud)
__CODE__
>>> str2bool("yes")
True
>>> str2bool("no")
False
>>> str2bool("stuff")
False
>>> str2bool("1")
True
>>> str2bool("0")
False
Run Code Online (Sandbox Code Playgroud)
__CODE__
def str2bool(v):
return v.lower() in ("yes", "true", "t", "1")
Run Code Online (Sandbox Code Playgroud)
__CODE__
>>> str2bool("yes")
True
>>> str2bool("no")
False
>>> str2bool("stuff")
False
>>> str2bool("1")
True
>>> str2bool("0")
False
Run Code Online (Sandbox Code Playgroud)
__CODE__
明确处理true和false:
您还可以使您的函数显式检查True列表和错误的单词列表.然后,如果它不在两个列表中,您可以抛出异常.
jzw*_*ner 246
只需使用:
distutils.util.strtobool(some_string)
Run Code Online (Sandbox Code Playgroud)
http://docs.python.org/2/distutils/apiref.html?highlight=distutils.util#distutils.util.strtobool
真值是y,yes,t,true,on和1; false值为n,no,f,false,off和0.如果val为其他值,则引发ValueError.
Jac*_*son 104
从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'
我通常不推荐这个,但它是完全内置的,根据您的要求可能是正确的.
小智 102
JSON解析器通常也可用于将字符串转换为合理的python类型.
>>> import json
>>> json.loads("false".lower())
False
>>> json.loads("True".lower())
True
Run Code Online (Sandbox Code Playgroud)
Joe*_*eau 35
如果您知道该字符串将是"True"或者"False",您可以使用eval(s).
>>> eval("True")
True
>>> eval("False")
False
Run Code Online (Sandbox Code Playgroud)
只有在确定字符串的内容时才使用它,因为如果字符串不包含有效的Python,它将抛出异常,并且还将执行字符串中包含的代码.
Yan*_*ann 22
pydantic有一个优雅的解决方案:
为了pydantic >=2:
from pydantic import TypeAdapter
>>> TypeAdapter(bool).validate_python("true")
True
>>> TypeAdapter(bool).validate_python("off")
False
Run Code Online (Sandbox Code Playgroud)
为了pydantic <2:
import pydantic
>>> pydantic.parse_obj_as(bool, "true")
True
>>> pydantic.parse_obj_as(bool, "off")
False
Run Code Online (Sandbox Code Playgroud)
Mic*_*ond 17
此版本保留构造函数的语义,如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
Run Code Online (Sandbox Code Playgroud)
Roe*_*oel 17
更新
注意:
eval()如果它直接从用户那里获取输入,请不要使用,因为它很容易被滥用:
eval('os.system(‘rm -rf /’)')但是干杯!研究还发现这
eval()不是邪恶的,对于受信任的代码来说完全可以。您可以使用它来将布尔字符串(例如"False"和 )"True"转换为布尔类型。
我想分享我的简单解决方案:使用eval(). 如果字符串完全是标题格式或总是第一个字母大写,它将转换字符串True并转换False为正确的布尔类型,否则函数将引发错误。TrueFalse
例如
>>> eval('False')
False
>>> eval('True')
True
Run Code Online (Sandbox Code Playgroud)
当然,对于动态变量,您可以简单地使用.title()来格式化布尔字符串。
>>> x = 'true'
>>> eval(x.title())
True
Run Code Online (Sandbox Code Playgroud)
这将引发错误。
>>> 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
Run Code Online (Sandbox Code Playgroud)
Pet*_*cio 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))
Run Code Online (Sandbox Code Playgroud)
样品运行:
>>> 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
>>>
Run Code Online (Sandbox Code Playgroud)
hel*_*dre 10
你总能做点什么
myString = "false"
val = (myString == "true")
Run Code Online (Sandbox Code Playgroud)
parens中的位将评估为False.这只是另一种方法,无需进行实际的函数调用.
一个很酷的简单技巧(根据@Alan Marchiori发布的内容),但使用yaml:
import yaml
parsed = yaml.load("true")
print bool(parsed)
Run Code Online (Sandbox Code Playgroud)
如果这个太宽,可以通过测试类型结果来改进它.如果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)
Run Code Online (Sandbox Code Playgroud)
结果如下:
>>> [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
Run Code Online (Sandbox Code Playgroud)
只是要清楚,因为看起来好像我的答案以某种方式冒犯了某人:
关键是你不想只测试一个值并假设另一个值.我不认为你总是想把所有的东西都映射到非解析的值.这会产生容易出错的代码.
所以,如果你知道你想要什么代码.
小智 8
通过使用下面的简单逻辑,您可以将字符串(如a = 'true'或'false', )转换为布尔值。
a = a.lower() == 'true'
Run Code Online (Sandbox Code Playgroud)
if a == 'true'then 将会设置a=True,并且 if a == 'false'then a=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]]
"""
Run Code Online (Sandbox Code Playgroud)
小智 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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
很容易将此方法定制为您想要的确切转换行为 - 您可以使用允许的Truthy和Falsy值填充它,并在找不到值时使其引发异常(或返回None),或者默认为True,或默认为False,或任何你想要的.
您只需使用内置函数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)
Run Code Online (Sandbox Code Playgroud)
和输出:
a isn't True, a type is <type 'str'>
b is True, b type is <type 'bool'>
Run Code Online (Sandbox Code Playgroud)
如果您知道您的输入将是其中之一"True"或其他内容,那么为什么不使用:
def bool_convert(s):
return s == "True"
Run Code Online (Sandbox Code Playgroud)
如果您可以控制返回的实体true/的实体false,一种选择是让它返回1/0而不是true/ false,然后:
boolean_response = bool(int(response))
int用于处理来自网络的响应的额外转换,这些响应始终是字符串。
2021 年更新:“始终是字符串”——这是一个天真的观察。这取决于库使用的序列化协议。高级库(大多数 Web 开发人员使用的库)的默认序列化通常是在序列化为字节之前转换为字符串。然后在另一边,它从字节反序列化为字符串,因此您丢失了任何类型信息。
又一个选择
from ansible.module_utils.parsing.convert_bool import boolean
boolean('no')
# False
boolean('yEs')
# True
boolean('true')
# True
Run Code Online (Sandbox Code Playgroud)