タイプtrue
のunicode
を1に、タイプfalse
のunicode
を0に(Pythonで)変換する方法はありますか?
例:x == 'true' and type(x) == unicode
x = 1
が欲しい
PS:if-elseを使いたくありません。
ブールテストでint()
を使用します。
x = int(x == 'true')
int()
は、ブール値を1
または0
に変換します。 notが'true'
と等しい場合、0
が返されることに注意してください。
B
がブール配列の場合、書き込み
B=B*1
(ビットコードゴルフィー)
それ自体がブールではない文字列からの汎用変換が必要な場合は、以下に示すようなルーチンを作成することをお勧めします。アヒルのタイピングの精神に沿って、私は黙ってエラーを渡しませんでしたが、現在のシナリオに合わせてエラーを変換しました。
>>> 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
ここにあなたの問題に対するさらに別の解決策があります:
def to_bool(s):
return 1 - sum(map(ord, s)) % 2
# return 1 - sum(s.encode('ascii')) % 2 # alternative for python3
'true'
のASCIIコードの合計が448
である偶数であるのに対し、'false'
のASCIIコードの合計は奇数である523
であるため、機能します。
このソリューションの面白い点は、入力がnot'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.5x timesfaster他のソリューションよりall。 notは、if
sの使用を避けるための要件として置くのは理にかなっています。そもそもこれ)。
x.astype('uint8')
を使用できます。ここでx
はブール配列です。