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


118

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

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

が欲しいです x = 1

PS:使いたくないif- else

回答:


164

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

x = int(x == 'true')

int()ブール値を1またはに変換し0ます。任意の値があること注意いないに等しい'true'になります0返されます。


これは素晴らしい答えです。ただし、「true」以外のすべてのものは「0」と解釈されます。それがOP要件に合うかどうかはわかりません。
Abhijit

それはおそらくOPが望んでいたものですが、Python 2.7で求められた質問と完全には一致しません。彼らは、タイプunicodeで機能することを明示的に要求し、タイプの動作を指定しませんでしたstr
wim

1
@wim実際、質問で pythonのバージョンについて言及されておらず、python2である必要があるという事実は言うまでもありません。。またpython2に注意u'true' == 'true'との間の入力タイプから正しくindipendently関数の振る舞いそうstrunicode]。
Bakuriu 2013

しかし、バクリウ、それがまさに私のポイントであり、「問題」はそれでu'true' == 'true'あり、私たちはユースケースが何であるかを知りません。多分彼らは状況のために異なる行動を望んでいtype(x) != unicodeます。
wim

1
@AlbertChen:いいえ。numpy配列は比較ブロードキャストし、ブール値を生成しないためです。代わりに、比較によりブール値の配列が生成されます。arrayvalue == 'true'比較で何が期待できるかわかりません。ここで回答した質問は、文字列(Unicode)値に固有のものです。
Martijn Pieters

136

Bがブール配列の場合は、

B = B*1

(ビットコードはゴルフィです。)


1
これとまったく同じことが単一の値でも機能します。これは素晴らしい!
user31415 2017年

2
Python 3では機能しません(配列はブール値のままです)。しかし、numpy.multiply(B,1)作品を使用しています。
Alaa M. 2017

これは私にとってpython 3で動作します!そしてそのような素晴らしい解決策。Oh my
alwaysaskingquestions 2017年

@Ourobours:あなたの提案に従うことは私にとってはうまくいきませんでした。元のsulotionが素晴らしい、実行可能な結果を​​与えたB=map(int,B)一方で、私のためにpython 3でマップオブジェクトを返しました。
Eulenfuchswiesel

1
@Eulenfuchswieselこれは、mapがPython3でイテレータを返すためです。リストとして使用するには、次のようにリストとしてキャストします。B = list(map(int、B))
Gigi Bayte 2


9

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

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


7

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

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

2
なぜTypeError?場合は文字列が含まれていない'true'か、'false'それはだエラー。入力が文字列でない場合は、AttributeError代わりに(99.99%の場合)が返されます。したがって、としてキャッチしValueErrorて再レイズしても意味がありませんTypeError
Bakuriu 2013

@Bakuriu:同意する。TypeErrorは実際にはここでは適用されませんでした。
Abhijit

@Bakuriu:好奇心からindex、AttributeError を発生させる例を挙げていただけますか?
georg

@Bakuriu:私はむしろ、以下のあなたのポストに言及していたと思います:return ['false', 'true'].index(s) except (ValueError, AttributeError)
georg

@ thg435この投稿lower()では、この追加の計算を行う唯一のソリューションであり、マイクロベンチマークに含めるのは正しくなかったため、コピー貼り付けして呼び出しを削除することにしました。もちろんtry...except、少しの時間もかかりますが、例外が発生しなければ(20ns以下のように)、違いはわずかです。
Bakuriu 2013

0

intへのブール値: x = (x == 'true') + 0

これでxは1を含み、x == 'true'そうでなければ0を含みます。

注:x == 'true'ブール値を返します。ブール値は、0を追加すると、値を持つブール値(ブール値がTrueの場合は1、それ以外は0)に型キャストされます。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.