web-dev-qa-db-ja.com

pythonで「false」を0に、「true」を1に変換する方法

タイプtrueunicodeを1に、タイプfalseunicodeを0に(Pythonで)変換する方法はありますか?

例:x == 'true' and type(x) == unicode

x = 1が欲しい

PS:if-elseを使いたくありません。

80

ブールテストでint()を使用します。

x = int(x == 'true')

int()は、ブール値を1または0に変換します。 not'true'と等しい場合、0が返されることに注意してください。

127
Martijn Pieters

Bがブール配列の場合、書き込み

B=B*1

(ビットコードゴルフィー)

112
Chipotle

それ自体がブールではない文字列からの汎用変換が必要な場合は、以下に示すようなルーチンを作成することをお勧めします。アヒルのタイピングの精神に沿って、私は黙ってエラーを渡しませんでしたが、現在のシナリオに合わせてエラーを変換しました。

>>> 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
7
Abhijit

ここにあなたの問題に対するさらに別の解決策があります:

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他のソリューションよりallnotは、ifsの使用を避けるための要件として置くのは理にかなっています。そもそもこれ)。

6
Bakuriu

x.astype('uint8')を使用できます。ここでxはブール配列です。

5
shahar_m