1002

Pythonで文字列からブール値に変換する方法を知っている人はいますか? このリンクを見つけました。しかし、それは適切な方法のようには見えません。つまり、組み込み機能などを使用します。

私がこれを尋ねている理由は、私がここから知ったint("string")からです。しかし、試しbool("string")てみると常に返されますTrue

>>> bool("False")
True
4

33 に答える 33

1077

本当に、文字列を true を表すものとして受け入れると予想されるものと比較するだけなので、次のことができます。

s == 'True'

または、一連の値全体に対してチェックするには:

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

以下を使用する場合は注意してください。

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

空の文字列は に評価されFalseますが、それ以外はすべて に評価されTrueます。したがって、これはいかなる種類の解析目的にも使用しないでください。

于 2009-04-03T19:52:56.183 に答える
309
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 を明示的に処理する:

また、True の単語リストと False の単語リストに対して関数を明示的にチェックすることもできます。どちらのリストにもない場合は、例外をスローできます。

于 2009-04-03T19:56:44.100 に答える
158

JSON パーサーは、通常、文字列を適切な Python 型に変換する場合にも役立ちます。

>>> import json
>>> json.loads("false".lower())
False
>>> json.loads("True".lower())
True
于 2012-12-04T15:38:14.847 に答える
121

Python 2.6 から、次のようになりましたast.literal_eval

>>> アストをインポート
>>> ヘルプ (ast.literal_eval)
モジュールastの関数literal_evalに関するヘルプ:

literal_eval(node_or_string)
    式ノードまたは Python を含む文字列を安全に評価する
    表現。指定された文字列またはノードは、次のもののみで構成されている場合があります
    Python リテラル構造: 文字列、数値、タプル、リスト、辞書、ブール値、
    そしてなし。

文字列がまたはのいずれかになることが確実である限り、これはうまくいくようです:"True""False"

>>> ast.literal_eval("真")
真実
>>> ast.literal_eval("偽")
間違い
>>> 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 内
    Raise ValueError('不正な文字列')
ValueError: 不正な文字列
>>> ast.literal_eval("'False'")
'間違い'

私は通常これをお勧めしませんが、完全に組み込まれており、要件によっては適切なものになる可能性があります。

于 2009-05-28T18:06:39.923 に答える
13

これが私のバージョンです。正の値と負の値の両方のリストをチェックし、不明な値の例外を発生させます。また、文字列は受け取りませんが、どのタイプでも受け取る必要があります。

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
>>>
于 2012-02-17T18:57:43.370 に答える
10

クールでシンプルなトリック (@Alan Marchiori の投稿に基づく) ですが、yaml を使用しています。

import yaml

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

これが広すぎる場合は、型の結果をテストすることで調整できます。yaml から返された型が str の場合、それを他の型にキャストすることはできない (とにかく考えられる) ため、それを個別に処理するか、単に true にすることができます。

急いで推測するつもりはありませんが、とにかく Qt gui の下で yaml データを扱っているので、これには優れた対称性があります。

于 2013-02-18T22:21:51.763 に答える
10

あなたはいつでも次のようなことをすることができます

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

括弧内のビットは False と評価されます。これは、実際の関数呼び出しを行わなくても済む別の方法です。

于 2009-04-03T19:53:23.203 に答える
9

彼らは寛容すぎるので、ここでの解決策には同意しません。これは通常、文字列を解析するときに必要なものではありません。

だからここで私が使用しているソリューション:

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

私の答えが何らかの形で誰かを怒らせたように見えるので、明確にするために:

ポイントは、1 つの値だけをテストして、もう 1 つの値を想定したくないということです。絶対にすべてを解析されていない値に常にマップしたいとは思わない。これにより、エラーが発生しやすいコードが生成されます。

したがって、何をコーディングしたいのかがわかっている場合は、それをコーディングしてください。

于 2012-11-26T10:04:22.103 に答える
7

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にするか、必要なものにします。

于 2012-03-16T17:47:14.640 に答える
5

おそらくすでに解決策がありますが、 false 、 no 、および 0 に加えて、 None、[]、{}、および "" を含む「標準」の false 値を使用して、値をブール値に変換する方法を探している他の人向けです。 .

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
于 2010-01-15T18:13:01.873 に答える
5

さらに別のオプション

from ansible.module_utils.parsing.convert_bool import boolean
boolean('no')
# False
boolean('yEs')
# True
boolean('true')
# True
于 2018-10-15T14:23:49.170 に答える
4

bool にキャストするための通常のルールは、いくつかの特別なリテラル ( False00.0()、 ) が false で[]{}それ以外はすべて true であるため、次のことをお勧めします。

def boolify(val):
    if (isinstance(val, basestring) and bool(val)):
        return not val in ('False', '0', '0.0')
    else:
        return bool(val)
于 2009-07-11T20:45:35.230 に答える
4

入力が「True」または「False」になることがわかっている場合は、次を使用しないでください。

def bool_convert(s):
    return s == "True"
于 2016-03-23T17:39:39.903 に答える
3

これは私が書いたバージョンです。他のソリューションのいくつかを 1 つに結合します。

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),
    ]
于 2012-05-14T17:07:45.410 に答える
3

また、任意の文字列リテラルを評価することもできます:

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'>
于 2021-06-21T10:48:45.350 に答える
2

以下の単純なロジックを使用することで、a = 'true' または 'false' などの文字列をブール値に変換できます。

a = a.lower() == 'true'

a == 'true' の場合は a=True に設定され、a == 'false' の場合は a=False に設定されます。

于 2021-12-02T16:02:34.253 に答える
1

これは古い投稿だと思いますが、一部のソリューションにはかなりのコードが必要です。最終的に使用したのは次のとおりです。

def str2bool(value):
    return {"True": True, "true": True}.get(value, False)
于 2013-08-09T21:37:50.293 に答える
1

これには三項演算子を使用するのが好きです。これは、1 行を超えてはならないと思われるものをもう少し簡潔にするためです。

True if myString=="True" else False
于 2012-08-01T13:07:39.643 に答える
1

パッケージstr2boolを使用 pip install str2bool

于 2019-02-20T12:59:49.667 に答える
0

これは、同じ答えの多くを得るために組み込まれている毛むくじゃらの方法です。python は""false と見なし、他のすべての文字列は true と見なしますが、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 インスタンスを作成する必要があることです。

何が true または false と見なされるかは の動作に依存します。これは、、、およびをfalse とTcl_GetBoolean見なし0false、、およびを true と見なし、大文字と小文字を区別しません。空の文字列を含むその他の文字列では、例外が発生します。nooff1trueyeson

于 2009-07-11T21:31:45.480 に答える
0

私はちょうどこれをしなければならなかった...だからパーティーに遅れるかもしれない-しかし誰かがそれが役に立つと思うかもしれない

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
于 2016-11-03T01:03:09.847 に答える
0

文字列の真実性を評価するためにまとめたものを次に示します。

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ですが、より安全です。

于 2012-01-29T08:09:54.540 に答える
0
def str2bool(str):
  if isinstance(str, basestring) and str.lower() in ['0','false','no']:
    return False
  else:
    return bool(str)

アイデア: 文字列を False と評価するかどうかを確認します。それ以外の場合、bool() は空でない文字列に対して True を返します。

于 2010-04-29T11:01:15.643 に答える