Question Conversion d'une chaîne en booléen en Python?


Est-ce que quelqu'un sait comment convertir une chaîne en une valeur booléenne en Python? j'ai trouvé ce lien. Mais cela ne semble pas être une bonne façon de le faire. C'est à dire. en utilisant une fonctionnalité intégrée, etc.

MODIFIER:

La raison pour laquelle j'ai posé cette question est parce que j'ai appris int("string"), d'ici. j'ai essayé bool("string") mais toujours True.

>>> bool("False")
True

461
2018-04-03 19:44


origine


Réponses:


Vraiment, vous comparez simplement la chaîne à tout ce que vous pensez accepter comme représentant vrai, donc vous pouvez faire ceci:

s == 'True'

Ou pour vérifier tout un tas de valeurs:

s in ['true', '1', 't', 'y', 'yes', 'yeah', 'yup', 'certainly', 'uh-huh']

Soyez prudent lorsque vous utilisez ce qui suit:

>>> bool("foo")
True
>>> bool("")
False

Les chaînes vides évaluent à False, mais tout le reste évalue à True. Donc, cela ne devrait pas être utilisé à des fins d'analyse.


564
2018-04-03 19:52



def str2bool(v):
  return v.lower() in ("yes", "true", "t", "1")

Alors appelez comme ça:

str2bool("yes")

> True

str2bool("no")

> False

str2bool("stuff")

> False

str2bool("1")

> True

str2bool("0")

> False


Gérer le vrai et le faux explicitement:

Vous pouvez également faire en sorte que votre fonction vérifie explicitement une liste de mots True et une liste de mots False. Ensuite, si elle n'est dans aucune liste, vous pouvez lancer une exception.


202
2018-04-03 19:56



Utilisez juste:

distutils.util.strtobool(some_string)

http://docs.python.org/2/distutils/apiref.html?highlight=distutils.util#distutils.util.strtobool

Les valeurs vraies sont y, yes, t, true, on et 1; Les valeurs fausses sont n, no, f, false, off et 0. Augmente ValueError si val est autre chose.


171
2017-08-27 17:42



À partir de Python 2.6, il y a maintenant ast.literal_eval:

>>> import ast
>>> aide (ast.literal_eval)
Aide sur la fonction literal_eval dans le module ast:

literal_eval (node_or_string)
    Évaluer en toute sécurité un noeud d'expression ou une chaîne contenant un Python
    expression. La chaîne ou le noeud fourni ne peut être composé que des éléments suivants
    Structures littérales Python: chaînes, nombres, tuples, listes, dicts, booléens,
    et aucun.

Ce qui semble fonctionner, tant que vous êtes sûr vos cordes vont être soit "True" ou "False":

>>> ast.literal_eval ("Vrai")
Vrai
>>> ast.literal_eval ("Faux")
Faux
>>> ast.literal_eval ("F")
Traceback (appel le plus récent en dernier):
  Fichier "", ligne 1, dans
  Fichier "/opt/Python-2.6.1/lib/python2.6/ast.py", ligne 68, dans literal_eval
    return _convert (node_or_string)
  Fichier "/opt/Python-2.6.1/lib/python2.6/ast.py", ligne 67, dans _convert
    raise ValueError ('chaîne mal formée')
ValueError: chaîne mal formée
>>> ast.literal_eval ("'Faux'")
'Faux'

Je ne recommanderais normalement pas cela, mais il est complètement intégré et pourrait être la bonne chose en fonction de vos besoins.


96
2018-05-28 18:06



L'analyseur JSON est également utile pour la conversion générale des chaînes en types python raisonnables.

>>> import json
>>> json.loads("false".lower())
False
>>> json.loads("True".lower())
True

62
2017-12-04 15:38



Cette version conserve la sémantique des constructeurs comme int (value) et fournit un moyen simple de définir des valeurs de chaîne acceptables.

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

14
2017-09-25 21:16



Voici ma version. Il vérifie les listes de valeurs positives et négatives, en levant une exception pour les valeurs inconnues. Et il ne reçoit pas de chaîne, mais tout type devrait le faire.

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

Exemple de courses:

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

12
2018-02-17 18:57



vous pouvez toujours faire quelque chose comme

myString = "false"
val = (myString == "true")

le bit en parens évaluerait à Faux. C'est juste une autre façon de le faire sans avoir à faire un appel de fonction réel.


9
2018-04-03 19:53



Je ne suis d'accord avec aucune solution ici, car ils sont trop permissifs. Ce n'est normalement pas ce que vous voulez lors de l'analyse d'une chaîne.

Alors voici la solution que j'utilise:

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)

Et les résultats:

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

Juste pour être clair car il semble que ma réponse ait offensé quelqu'un d'une façon ou d'une autre:

Le fait est que vous ne voulez pas tester une seule valeur et assumer l'autre. Je ne pense pas que vous voulez toujours mapper Absolument tout à la valeur non analysée. Cela produit un code source d'erreur.

Donc, si vous savez ce que vous voulez le coder.


7
2017-11-26 10:04



Vous pouvez simplement utiliser la fonction intégrée 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)

et la sortie:

a isn't True, a type is <type 'str'>
b is True, b type is <type 'bool'>

7
2017-08-11 11:27