Python中将字符串转换为布尔值

1247

在Python中如何将字符串转换为布尔值?以下尝试会返回 True

>>> bool("False")
True

4
我已经创建了一个微型库,其中包括一些外语单词,例如波兰语中的“tak”,中文中的“'是的”将评估为__True__。如果不明确为true-ish,则评估为__False__。欢迎提供建议。Github链接:https://github.com/kmonsoor/str2bool - kmonsoor
但是当尝试使用 bool("string") 时,它总是返回 True...除了空字符串 bool("") - FiddleStix
你在想Perl!:-D - MikeW
39个回答

4
通常将值转换为布尔型的规则是,一些特殊字面量(False00.0()[]{})为假,其余都为真。因此,我建议按照以下方式进行转换:
def boolify(val):
    if (isinstance(val, basestring) and bool(val)):
        return not val in ('False', '0', '0.0')
    else:
        return bool(val)

4

您还可以评估任何字符串字面量:

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'>

4
如果您像我一样只需要从字符串变量中获取布尔值,可以使用distils,例如由@jzwiener提到。然而,我无法像他建议的那样导入和使用该模块。
相反,在python3.7中,我是这样使用它的。

distutils string to bool in python

from distutils import util # to handle str to bool conversion
enable_deletion = 'False'
enable_deletion = bool(util.strtobool(enable_deletion))

distutils 是 Python 标准库的一部分,无需安装任何东西,这非常棒!

2
请注意,自 Python 3.10 版本起,distutils 包已被弃用,并将在版本 3.12 中删除。 - jan-di
就像生活中的一切,好事情总会有结束的时候 :( - Gunay Anach

3
在 Python 3.10 版本中,您可以像这样做:
def stringToBool(string: str) -> bool:
    match(string.lower()):
        case 'true':
            return True
        case 'false':
            return False

match语句在C++中等效于switch语句。


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),
    ]

1
使用 str 代替 type('') - pppery

2

使用这个解决方案:

def to_bool(value) -> bool:
    if value == 'true':
        return True
    elif value == 'True':
        return True
    elif value == 'false':
        return False
    elif value == 'False':
        return False
    elif value == 0:
        return False
    elif value == 1:
        return True
    else:
        raise ValueError("Value was not recognized as a valid Boolean.")

1
我喜欢这个,因为它是处理不正确的输入的唯一解决方案之一。 - Neuron

2

我完全同意@Jacob Gabrielson的解决方案,但问题是ast.literal_eval只能处理TrueFalse的字符串值,而不能处理truefalse。因此,你只需使用.title()即可使其正常工作。

import ast
ast.literal_eval("false".title())
# or
ast.literal_eval("False".title())

并不能解决字符串可能是"0"的问题。>>> type(ast.literal_eval("0".title())) <class 'int'> - sagi

1

如果需要,我们可能需要不区分大小写地捕获“true”:

>>> x="TrUE"  
>>> x.title() == 'True'  
True  

>>> x="false"  
>>> x.title() == 'True'  
False  

还要注意的是,对于任何既不为真也不为假的其他输入,它都会返回False。


你也可以直接使用x in 'True true',这样会更短。但是仍然不好,因为它会把'ue tr'认作True... - Neuron
@Neuron 说得好。已编辑。 - RE_Specto

1

我还需要将一个函数的输入更改为bool类型,主要输入只能是TrueFalse字符串。因此,我只需编写以下代码:

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

你还可以检查更多缩写,如TrueFalse,例如Y/Ny/n等。

额外的 bool_flag 变量是如此无用。 - BlakBat
@BlakBat 怎么了?你能解释一下为什么它是无用的吗? - ARHAM RUMI
只需返回值:如果s ==“False”:返回False. 等等。 - BlakBat

1

我知道这是一篇旧帖子,但有些解决方案需要相当多的代码,这是我最终使用的:

def str2bool(value):
    return {"True": True, "true": True}.get(value, False)

9
这与以下代码功能上等价且更加复杂:return value in ('True', 'true')。 - Keith Gaughan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接