it-swarm.com.ru

Преобразование из строки в логическое значение в Python?

Кто-нибудь знает, как сделать преобразование из строки в логическое значение в Python? Я нашел эта ссылка . Но это не похоже на правильный способ сделать это. То есть использование встроенного функционала и т. д.

Правка:

Я спросил это по той причине, что я узнал int("string") отсюда. Я пробовал bool("string"), но всегда получал True.

>>> bool("False")
True
545
Joan Venge

На самом деле, вы просто сравниваете строку с тем, что вы ожидаете принять как представляющее истину, так что вы можете сделать это:

s == 'True'

Или для проверки целой связки значений:

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

Будьте осторожны при использовании следующего:

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

Пустые строки оцениваются как False, но все остальное оценивается как True. Так что это не должно использоваться для каких-либо целей анализа.

643
Keith Gaughan
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 и False. Тогда, если его нет ни в одном списке, вы можете выдать исключение. 

221
Brian R. Bondy

Просто используйте:

distutils.util.strtobool(some_string)

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

Истинными значениями являются y, да, t, true, on и 1; ложными значениями являются n, no, f, false, off и 0. Вызывает ValueError, если val - что-то еще.

200
jzwiener

Начиная с Python 2.6, теперь есть ast.literal_eval:

 >>> import ast 
 >>> help (ast.literal_eval) 
 Справка по функции literal_eval в модуле ast: 

 literal_eval (node_or_string) 
 Безопасно оцените узел выражения или строку, содержащую Python 
 выражение. Предоставленная строка или узел могут состоять только из следующих 
 Литеральные структуры Python: строки, числа, кортежи, списки, dicts, booleans, 
 и нет .

Это, кажется, работает, если вы уверены ваши строки будут либо "True", либо "False":

 >>> ast.literal_eval ("True") 
 True 
 >>> ast.literal_eval ("False") 
 False 
 >>> ast.literal_eval ("F") 
 Traceback (последний вызов был последним): 
 Файл "", строка 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 ('искаженная строка') 
 ValueError: неправильно сформированная строка 
 >>> ast.literal_eval ("'False'") 
 'False' 

Обычно я бы не рекомендовал это, но он полностью встроен и может быть правильным в зависимости от ваших требований.

101
Jacob Gabrielson

Парсер JSON также полезен для общего преобразования строк в приемлемые типы Python.

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

Эта версия сохраняет семантику конструкторов, таких как 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
14
Michael Richmond

Вот моя версия. Он проверяет списки как положительных, так и отрицательных значений, вызывая исключение для неизвестных значений. И он не получает строку, но любой тип должен делать.

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

Если вы знаете, что строка будет "True" или "False", вы можете просто использовать eval(s).

>>> eval("True")
True
>>> eval("False")
False

Используйте это только в том случае, если вы уверены в содержимом строки, так как это вызовет исключение, если строка не содержит допустимого Python, а также выполнит код, содержащийся в строке.

10
Joel Croteau

вы всегда можете сделать что-то вроде 

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

бит в паренсе оценивается как ложный. Это просто еще один способ сделать это без необходимости фактического вызова функции.

9
helloandre

Вы можете просто использовать встроенную функцию 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'>
8
lumartor

Я не согласен с каким-либо решением здесь, поскольку они слишком разрешительны. Обычно это не то, что вы хотите при разборе строки.

Итак, вот решение, которое я использую:

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

Просто чтобы быть ясно, потому что, похоже, мой ответ как-то кого-то обидел

Дело в том, что вы не хотите проверять только одно значение, а другое принимаете. Я не думаю, что вы всегда хотите отобразить Абсолютно все на непарсированное значение. Это приводит к ошибочному коду.

Так что, если вы знаете, что вы хотите, закодируйте это в.

7
estani

Крутой, простой трюк (основанный на том, что написал @Alan Marchiori), но использующий yaml:

import yaml

parsed = yaml.load("true")
print bool(parsed)

Если оно слишком широкое, его можно уточнить, протестировав результат типа. Если возвращаемый yaml тип является str, то он не может быть приведен к какому-либо другому типу (о чем я могу думать в любом случае), так что вы можете обработать это отдельно или просто позволить ему быть верным.

Я не буду догадываться о скорости, но так как я все равно работаю с данными yaml в Qt gui, это имеет симметрию Nice.

6
Rafe

DICT (на самом деле, 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 и позволить ему вызывать исключение (или возвращать None), когда значение не найдено, или по умолчанию True, или по умолчанию False, или все, что вы хотите.

5
Nate

Возможно, у вас уже есть решение, но для тех, кто ищет метод для преобразования значения в логическое значение, используя «стандартные» ложные значения, включая 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
5
Chris McMillan

Я понимаю, что это старый пост, но некоторые решения требуют немного кода, вот что я в итоге использовал:

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

Это версия, которую я написал. Объединяет несколько других решений в одно.

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),
    ]
3
Tom Ekberg

Обычное правило приведения к типу bool состоит в том, что несколько специальных литералов (False, 0, 0.0, (), [], {}) имеют значение false, а затем все остальное верно, поэтому я рекомендую следующее:

def boolify(val):
    if (isinstance(val, basestring) and bool(val)):
        return not val in ('False', '0', '0.0')
    else:
        return bool(val)
3
Carl G

Мне нравится использовать троичный оператор для этого, поскольку он более лаконичен для того, что кажется, что оно не должно быть больше 1 строки.

True if myString=="True" else False
2
Clayton Rabenda

Если вы знаете, что ваш ввод будет «True» или «False», то почему бы не использовать:

def bool_convert(s):
    return s == "True"
2
Daniel van Flymen

Еще один вариант

from ansible.module_utils.parsing.convert_bool import boolean
boolean('no')
# False
boolean('yEs')
# True
boolean('true')
# True

Но в производственном процессе, если вам не нужен ansible и все его зависимости, хорошей идеей будет посмотреть на его исходный код и скопировать часть необходимой вам логики: https://github.com/ansible/ansible/blob/2bd6b1415b9131c3a7cb13724f5d31bb0d33846b /lib/ansible/module_utils/parsing/convert_bool.py

1
Maciej Kucia

Я просто должен был сделать это ... так что, возможно, опоздал на вечеринку - но кто-то может найти это полезным

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

вот волосатый, построенный таким образом, чтобы получить много одинаковых ответов. Обратите внимание, что хотя 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иoffложным и1,true,yesиonистинно, без учета регистра. Любая другая строка, включая пустую строку, вызывает исключение.

0
SingleNegationElimination
def str2bool(str):
  if isinstance(str, basestring) and str.lower() in ['0','false','no']:
    return False
  else:
    return bool(str)

идея: проверьте, хотите ли вы, чтобы строка была оценена как False; в противном случае bool () возвращает True для любой непустой строки.

0
xvga

Используйте пакет str2boolpip install str2bool

0
Headmaster

Вот что-то, что я собрал, чтобы оценить истинность строки:

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, но безопаснее.

0
tylerl

Если у вас есть контроль над сущностью, которая возвращает true/false, один из вариантов - вернуть 1/0 вместо true/false, тогда:

boolean_response = bool(int(response))

Дополнительное приведение к int обрабатывает ответы из сети, которые всегда являются строковыми.

0
LXXIII