回答:
int()
ブールテストで使用します。
x = int(x == 'true')
int()
ブール値を1
またはに変換し0
ます。任意の値があること注意いないに等しい'true'
になります0
返されます。
str
。
u'true' == 'true'
との間の入力タイプから正しくindipendently関数の振る舞いそうstr
とunicode
]。
u'true' == 'true'
あり、私たちはユースケースが何であるかを知りません。多分彼らは状況のために異なる行動を望んでいtype(x) != unicode
ます。
arrayvalue == 'true'
比較で何が期待できるかわかりません。ここで回答した質問は、文字列(Unicode)値に固有のものです。
B
がブール配列の場合は、
B = B*1
(ビットコードはゴルフィです。)
numpy.multiply(B,1)
作品を使用しています。
B=map(int,B)
一方で、私のためにpython 3でマップオブジェクトを返しました。
ここにあなたの問題のさらに別の解決策があります:
def to_bool(s):
return 1 - sum(map(ord, s)) % 2
# return 1 - sum(s.encode('ascii')) % 2 # Alternative for Python 3
これは、動作するためのASCIIコードの合計'true'
IS 448
のASCIIコードの合計ながら、でもあり、'false'
ISは523
奇数です。
このソリューションについての面白いことは、入力された場合、その結果はかなりランダムであるということであるではないの'true'
か'false'
。時間の半分は戻り0
、残りの半分は戻り1
ます。バリアントを使用encode
すると、入力がASCIIでない場合にエンコーディングエラーが発生します(そのため、動作の未定義が増加します)。
まじめな話、私は最も読みやすいと考えている、と速く、溶液を使用することですif
:
def to_bool(s):
return 1 if s == 'true' else 0
いくつかのマイクロベンチマークを参照してください:
In [14]: def most_readable(s):
...: return 1 if s == 'true' else 0
In [15]: def int_cast(s):
...: return int(s == 'true')
In [16]: def str2bool(s):
...: try:
...: return ['false', 'true'].index(s)
...: except (ValueError, AttributeError):
...: raise ValueError()
In [17]: def str2bool2(s):
...: try:
...: return ('false', 'true').index(s)
...: except (ValueError, AttributeError):
...: raise ValueError()
In [18]: def to_bool(s):
...: return 1 - sum(s.encode('ascii')) % 2
In [19]: %timeit most_readable('true')
10000000 loops, best of 3: 112 ns per loop
In [20]: %timeit most_readable('false')
10000000 loops, best of 3: 109 ns per loop
In [21]: %timeit int_cast('true')
1000000 loops, best of 3: 259 ns per loop
In [22]: %timeit int_cast('false')
1000000 loops, best of 3: 262 ns per loop
In [23]: %timeit str2bool('true')
1000000 loops, best of 3: 343 ns per loop
In [24]: %timeit str2bool('false')
1000000 loops, best of 3: 325 ns per loop
In [25]: %timeit str2bool2('true')
1000000 loops, best of 3: 295 ns per loop
In [26]: %timeit str2bool2('false')
1000000 loops, best of 3: 277 ns per loop
In [27]: %timeit to_bool('true')
1000000 loops, best of 3: 607 ns per loop
In [28]: %timeit to_bool('false')
1000000 loops, best of 3: 612 ns per loop
if
ソリューションが他のすべてのソリューションよりも少なくとも 2.5倍速いことに注目してください。これが何らかの宿題である場合を除いて、sの使用を避けるための要件として置くことは意味がありません(その場合、最初にこれを尋ねるべきではありませんでした)。if
それ自体がブール値ではない文字列からの汎用変換が必要な場合は、以下に示すようなルーチンを作成することをお勧めします。アヒルのタイピングの精神に沿って、私は黙ってエラーをパスしていませんが、現在のシナリオに合わせて適切に変換しています。
>>> def str2bool(st):
try:
return ['false', 'true'].index(st.lower())
except (ValueError, AttributeError):
raise ValueError('no Valid Conversion Possible')
>>> str2bool('garbaze')
Traceback (most recent call last):
File "<pyshell#106>", line 1, in <module>
str2bool('garbaze')
File "<pyshell#105>", line 5, in str2bool
raise TypeError('no Valid COnversion Possible')
TypeError: no Valid Conversion Possible
>>> str2bool('false')
0
>>> str2bool('True')
1
TypeError
?場合は文字列が含まれていない'true'
か、'false'
それはだ値エラー。入力が文字列でない場合は、AttributeError
代わりに(99.99%の場合)が返されます。したがって、としてキャッチしValueError
て再レイズしても意味がありませんTypeError
。
index
、AttributeError を発生させる例を挙げていただけますか?
return ['false', 'true'].index(s) except (ValueError, AttributeError)
。
lower()
では、この追加の計算を行う唯一のソリューションであり、マイクロベンチマークに含めるのは正しくなかったため、コピー貼り付けして呼び出しを削除することにしました。もちろんtry...except
、少しの時間もかかりますが、例外が発生しなければ(20ns
以下のように)、違いはわずかです。
これだけで:
const a = true; const b = false;
console.log(+ a); // 1 console.log(+ b); // 0