在Python中从一个string转换为布尔值?
有谁知道如何做从string转换为布尔值在Python中? 我发现这个链接 。 但它看起来不是一个正确的方法来做到这一点。 即使用内置的function等
编辑:
我问这个的原因是因为我从这里学到了int("string")
。 我试过bool("string")
但总是得到True
。
>>> bool("False") True
真的,你只是比较string与你期望接受的代表真实,所以你可以这样做:
s == 'True'
或者检查一大堆值:
s in ['true', '1', 't', 'y', 'yes', 'yeah', 'yup', 'certainly', 'uh-huh']
使用以下内容时要小心:
>>> bool("foo") True >>> bool("") False
空string评估为False
,但其他一切评估为True
。 所以这不应该用于任何types的parsing目的。
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
明确处理真假:
你也可以使你的函数显式检查一个真正的单词列表和一个错误的单词列表。 那么如果它不在列表中,则可以抛出exception。
只要使用:
distutils.util.strtobool(some_string)
http://docs.python.org/2/distutils/apiref.html?highlight=distutils.util#distutils.util.strtobool
真正的价值观是y,是的,t,真,在和1; 错误的值是n,no,f,false,off和0.如果val是别的,则引发ValueError。
从Python 2.6开始,现在有ast.literal_eval
:
>>> import ast >>> help(ast.literal_eval) 帮助模块ast中的函数literal_eval: literal_eval(node_or_string) 安全地评估expression式节点或包含Python的string expression。 提供的string或节点可能只包含以下内容 Python文字结构:string,数字,元组,列表,字典,布尔值, 和None。
这似乎工作,只要你确定你的string要么是"True"
或"False"
:
>>> ast.literal_eval(“True”) 真正 >>> ast.literal_eval(“False”) 假 >>> ast.literal_eval(“F”) 回溯(最近一次通话最后): 文件“”,第1行, 文件“/opt/Python-2.6.1/lib/python2.6/ast.py”,第68行,在literal_eval return _convert(node_or_string) 文件“/opt/Python-2.6.1/lib/python2.6/ast.py”,第67行,在_convert 提高ValueError('malformed string') ValueError:格式不正确的string >>> ast.literal_eval(“'False'”) '假'
我通常不会推荐这个,但它是完全内置的,根据您的要求可能是正确的。
JSONparsing器对于通常将string转换为合理的pythontypes也很有用。
>>> import json >>> json.loads("false") False >>> json.loads("true") True
这是我的版本。 它检查正面和负面值列表,引发未知值的exception。 它没有收到一个string,但任何types都应该这样做。
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 >>>
这个版本保持构造函数的语义,如int(value),并提供了一个简单的方法来定义可接受的string值。
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() :
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'>
你总是可以做类似的事情
myString = "false" val = (myString == "true")
在parens中的位将评估为False。 这只是另一种方法来做到这一点,而不必做一个实际的函数调用。
我不同意这里的任何解决办法,因为他们太宽松了。 在parsing一个string时,这通常不是你想要的。
所以这里我使用的解决scheme:
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
只是为了清楚,因为它看起来好像我的回答冒犯了某人:
重点是你不想testing只有一个值,并假设其他值。 我不认为你总是想把绝对的东西映射到非parsing的值。 这会产生易出错的代码。
所以,如果你知道你想要的代码。
您可能已经有了一个解决scheme,但是对于其他人正在寻找一种方法来使用“标准”假值,包括无,[],{}和“”将值转换为布尔值,除了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
一个字典(真的,一个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值填充该值,并在未find值时将其引发exception(或返回无),或者默认为True,或默认为假,或任何你想要的。
这是我写的版本。 将其他几个解决scheme合并为一个。
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)
如果它得到一个string,它期望具体的值,否则引发一个exception。 如果它没有得到一个string,只需让布尔构造函数找出它。 testing了这些情况:
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), ]
我喜欢使用三元运算符,因为对于感觉不应该超过1行的东西来说,它更简洁一些。
True if myString=="True" else False
一个很酷的,简单的技巧(基于@Arange Marchiori发布的),但是使用yaml:
import yaml parsed = yaml.load("true") print bool(parsed)
如果这太宽了,可以通过testingtypes结果来改进。 如果yaml返回types是一个str,那么它就不能被转换成任何其他types(我可以想到),所以你可以单独处理它,或者让它成为true。
我不会在速度上做出任何猜测,但是由于我正在使用Qt gui下的yaml数据,所以它具有很好的对称性。
铸造一个布尔的通常规则是一些特殊的文字( False
, 0.0
, ()
, []
, {}
)是假的,然后一切都是真实的,所以我build议如下:
def boolify(val): if (isinstance(val, basestring) and bool(val)): return not val in ('False', '0', '0.0') else: return bool(val)
我意识到这是一个旧的post,但一些解决scheme需要相当多的代码,这是我最终使用的:
def str2bool(value): return {"True": True, "true": True}.get(value, False)
这里有一个毛茸茸的,build立在获得许多相同的答案的方式。 请注意,虽然python认为""
是错误的,而所有其他的string都是正确的,但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 /']" >>>
关于这一点的一个好处是,它是相当宽容的,你可以使用的价值。 将string转换为值是懒惰的,它接受和拒绝的是卫生的(注意,如果上述语句是在tcl提示符下给出的,则会清除用户的硬盘)。
坏处是它需要Tkinter是可用的,这通常是,但不是普遍真实的,更重要的是要求创build一个Tk实例,这是比较沉重的。
什么被视为真或假取决于Tcl_GetBoolean
的行为,它认为0
, false
, no
和off
是假的, 1
, true
, yes
和on
是真的,不区分大小写。 任何其他string(包括空string)都会导致exception。
def str2bool(str): if isinstance(str, basestring) and str.lower() in ['0','false','no']: return False else: return bool(str)
想法:检查是否要将string评估为False; 否则bool()对任何非空string返回True。
这是我扔在一起评估一个string的真实性的东西:
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
如果你知道你的input将是“真”或“假”,那么为什么不使用:
def bool_convert(s): return s == "True"