Pythonで文字列からブール値に変換する方法を知っている人はいますか? このリンクを見つけました。しかし、それは適切な方法のようには見えません。つまり、組み込み機能などを使用します。
私がこれを尋ねている理由は、私がここから知ったint("string")
からです。しかし、試しbool("string")
てみると常に返されますTrue
:
>>> bool("False")
True
本当に、文字列を true を表すものとして受け入れると予想されるものと比較するだけなので、次のことができます。
s == 'True'
または、一連の値全体に対してチェックするには:
s.lower() in ['true', '1', 't', 'y', 'yes', 'yeah', 'yup', 'certainly', 'uh-huh']
以下を使用する場合は注意してください。
>>> bool("foo")
True
>>> bool("")
False
空の文字列は に評価されFalse
ますが、それ以外はすべて に評価されTrue
ます。したがって、これはいかなる種類の解析目的にも使用しないでください。
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 の単語リストに対して関数を明示的にチェックすることもできます。どちらのリストにもない場合は、例外をスローできます。
JSON パーサーは、通常、文字列を適切な Python 型に変換する場合にも役立ちます。
>>> import json
>>> json.loads("false".lower())
False
>>> json.loads("True".lower())
True
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'") '間違い'
私は通常これをお勧めしませんが、完全に組み込まれており、要件によっては適切なものになる可能性があります。
これが私のバージョンです。正の値と負の値の両方のリストをチェックし、不明な値の例外を発生させます。また、文字列は受け取りませんが、どのタイプでも受け取る必要があります。
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
>>>
クールでシンプルなトリック (@Alan Marchiori の投稿に基づく) ですが、yaml を使用しています。
import yaml
parsed = yaml.load("true")
print bool(parsed)
これが広すぎる場合は、型の結果をテストすることで調整できます。yaml から返された型が str の場合、それを他の型にキャストすることはできない (とにかく考えられる) ため、それを個別に処理するか、単に true にすることができます。
急いで推測するつもりはありませんが、とにかく Qt gui の下で yaml データを扱っているので、これには優れた対称性があります。
あなたはいつでも次のようなことをすることができます
myString = "false"
val = (myString == "true")
括弧内のビットは False と評価されます。これは、実際の関数呼び出しを行わなくても済む別の方法です。
彼らは寛容すぎるので、ここでの解決策には同意しません。これは通常、文字列を解析するときに必要なものではありません。
だからここで私が使用しているソリューション:
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 つの値を想定したくないということです。絶対にすべてを解析されていない値に常にマップしたいとは思わない。これにより、エラーが発生しやすいコードが生成されます。
したがって、何をコーディングしたいのかがわかっている場合は、それをコーディングしてください。
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にするか、必要なものにします。
おそらくすでに解決策がありますが、 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
さらに別のオプション
from ansible.module_utils.parsing.convert_bool import boolean
boolean('no')
# False
boolean('yEs')
# True
boolean('true')
# True
bool にキャストするための通常のルールは、いくつかの特別なリテラル ( False
、0
、0.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)
入力が「True」または「False」になることがわかっている場合は、次を使用しないでください。
def bool_convert(s):
return s == "True"
これは私が書いたバージョンです。他のソリューションのいくつかを 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),
]
また、任意の文字列リテラルを評価することもできます:
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'>
以下の単純なロジックを使用することで、a = 'true' または 'false' などの文字列をブール値に変換できます。
a = a.lower() == 'true'
a == 'true' の場合は a=True に設定され、a == 'false' の場合は a=False に設定されます。
これは古い投稿だと思いますが、一部のソリューションにはかなりのコードが必要です。最終的に使用したのは次のとおりです。
def str2bool(value):
return {"True": True, "true": True}.get(value, False)
これには三項演算子を使用するのが好きです。これは、1 行を超えてはならないと思われるものをもう少し簡潔にするためです。
True if myString=="True" else False
パッケージstr2boolを使用 pip install str2bool
これは、同じ答えの多くを得るために組み込まれている毛むくじゃらの方法です。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
見なし0
、false
、、およびを true と見なし、大文字と小文字を区別しません。空の文字列を含むその他の文字列では、例外が発生します。no
off
1
true
yes
on
私はちょうどこれをしなければならなかった...だからパーティーに遅れるかもしれない-しかし誰かがそれが役に立つと思うかもしれない
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
文字列の真実性を評価するためにまとめたものを次に示します。
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 str2bool(str):
if isinstance(str, basestring) and str.lower() in ['0','false','no']:
return False
else:
return bool(str)
アイデア: 文字列を False と評価するかどうかを確認します。それ以外の場合、bool() は空でない文字列に対して True を返します。