note.nkmk.me

Pythonの真偽値bool型(True, False)と他の型との変換・判定

Date: 2018-10-20 / tags: Python

Pythonにおいて真偽値(真理値)はbool型のオブジェクトTrueFalseで表される。比較演算子による比較の結果などはTrue, Falseで返され、if文などの条件式で使われる。

ここでは以下の内容について説明する。

  • bool型はint型のサブクラス
    • boolTrueFalse1, 0と等価
  • Pythonにおける真偽値(真理値)の判定
  • 他の型からbool型への変換: bool()
    • 特定の文字列を1, 0へ変換: distutils.util.strtobool()
  • bool型から他の型への変換
    • 数値への変換: int(), float(), complex()
    • 文字列への変換: str()
    • その他の型
スポンサーリンク

bool型はint型のサブクラス

True, Falsebool型のオブジェクト。

print(type(True))
# <class 'bool'>

print(type(False))
# <class 'bool'>

bool型は整数int型のサブクラスであることが組み込み関数issubclass()で確認できる。

print(issubclass(bool, int))
# True

bool型TrueとFalseは1, 0と等価

True, Falseはそれぞれ1, 0と等価。

print(True == 1)
# True

print(False == 0)
# True

整数int型のサブクラスなので、普通に演算することも可能。

print(True + True)
# 2

print(True * 10)
# 10

このため、リストに格納された数値の合計を算出する組み込み関数sum()を使って、TrueFalseのリストからTrueの数をカウントできる。

print(sum([True, False, True]))
# 2

これをジェネレータ式と組み合わせると、条件を満たすリストの要素数をカウントできる。

ジェネレータ式はリスト内包表記のジェネレータ版。ジェネレータ式を関数の唯一の引数とする場合()を省略できるので以下のように書ける。

l = [0, 1, 2, 3, 4]

print([i > 2 for i in l])
# [False, False, False, True, True]

print(sum(i > 2 for i in l))
# 2

リスト内包表記の書き方については以下の記事を参照。

Pythonにおける真偽値(真理値)の判定

Pythonではbool型のTrue, False以外のオブジェクトもif文の条件式などでは真偽のいずれかに判定される。

公式ドキュメントにあるように、以下のオブジェクトはFalseとして判定される。

  • 偽であると定義されている定数: NoneFalse
  • 数値型におけるゼロ: 0, 0.0, 0j(複素数), Decimal(0), Fraction(0, 1)
  • 空のシーケンスまたはコレクション: '', (), [], {}, set(), range(0)

その他のオブジェクトはすべてTrueとして判定される。

例えば、空でない文字列はTrue

if 'abc':
    print('True!')
# True!

オブジェクトがTrue, Falseのどちらに判定されるかは次に説明するbool()で確認できる。

他の型からbool型への変換: bool()

bool()を使うと、上述の真理値判定に従って、他の型のオブジェクトをbool型のTrueFalseに変換できる。

'True'でも'False'でも、空でない文字列str型はすべてTrue。空文字列はFalse。文字列の内容に応じて変換したい場合は次に説明するdistutils.util.strtobool()を使う。

print(bool('True'))
print(bool('False'))
print(bool('abc'))
# True
# True
# True

print(bool(''))
# False
source: bool_test.py

整数intも浮動小数点数floatも複素数complexも、0でない数値はすべてTrue0False

print(bool(1))
print(bool(2))
print(bool(1.23))
print(bool(-1))
# True
# True
# True
# True

print(bool(0))
print(bool(0.0))
print(bool(0j))
# False
# False
# False
source: bool_test.py

リストもタプルも集合setも辞書dictも、空でないシーケンス、コレクションはすべてTrue。空のシーケンス、コレクションはFalse

print(bool([1, 2, 3]))
print(bool((1, 2, 3)))
print(bool({1, 2, 3}))
print(bool({'k1': 1, 'k2':2, 'k3': 3}))
# True
# True
# True
# True

print(bool([]))
print(bool(()))
print(bool({}))
# False
# False
# False
source: bool_test.py

NoneFalse

print(bool(None))
# False
source: bool_test.py

特定の文字列を1, 0へ変換: distutils.util.strtobool()

上述のように、bool()では文字列'False'Trueに変換される。

文字列の内容に応じて変換したい場合はdistutils.util.strtobool()を使う。

真の値は y, yes, t, true, on そして 1 です。偽の値は n, no, f, false, off そして 0 です。 val が上のどれでもない時は ValueError を起こします。
10. API リファレンス - distutils.util.strtobool() — Python 3.7.1rc2 ドキュメント

distutils.utilをインポートして使う。標準ライブラリなので追加のインストールは不要。

文字列'y', 'yes', 'true', 'on', '1'は真(1)、文字列'n', 'no', 'f', 'false', 'off', '0'は偽(0)を返す。大文字小文字は関係ないので'TRUE''True, 'YES'などでもOK。

from distutils.util import strtobool

print(strtobool('true'))
print(strtobool('True'))
print(strtobool('TRUE'))
# 1
# 1
# 1

print(strtobool('t'))
print(strtobool('yes'))
print(strtobool('y'))
print(strtobool('on'))
print(strtobool('1'))
# 1
# 1
# 1
# 1
# 1

print(strtobool('false'))
print(strtobool('False'))
print(strtobool('FALSE'))
# 0
# 0
# 0

print(strtobool('f'))
print(strtobool('no'))
print(strtobool('n'))
print(strtobool('off'))
print(strtobool('0'))
# 0
# 0
# 0
# 0
# 0

それ以外はエラー(ValueError)。

# print(strtobool('abc'))
# ValueError: invalid truth value 'abc'

規定の文字列以外の入力も受け付けたい場合は例外処理を行う必要がある。

try:
    strtobool('abc')
except ValueError as e:
    print('other value')
# other value

strtobool()という名前だが、返り値はbool型ではなくint型(1または0)。

print(type(strtobool('true')))
# <class 'int'>

if文の条件式などでは1, 0True, Falseとして判定されるので、そのまま使って問題ない。

if strtobool('yes'):
    print('True!')
# True!

bool型から他の型への変換

数値への変換: int(), float(), complex()

上述のように、True, Falseはそれぞれ1, 0と等価なので、int(), float(), complex()で各型(整数、浮動小数点数、複素数)の1, 0に変換できる。

print(int(True))
print(int(False))
# 1
# 0

print(float(True))
print(float(False))
# 1.0
# 0.0

print(complex(True))
print(complex(False))
# (1+0j)
# 0j

文字列への変換: str()

str()で文字列'True', 'False'に変換できる。print()の出力だと見分けがつかないが、文字列str型に変換されている。

print(str(True))
print(str(False))
# True
# False

print(type(str(True)))
print(type(str(False)))
# <class 'str'>
# <class 'str'>

空でない文字列はTrueとして扱われるため、Falsestr()で文字列に変換してから再度bool()bool型に戻すとTrueになる。注意。

print(bool(str(False)))
# True

その他の型

bool型からリストやタプルには変換できずエラーになる。空のリストに変換されたりはしない。

# print(list(True))
# TypeError: 'bool' object is not iterable
スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事