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

Modified: | Tags: Python

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

bool型はint型のサブクラス

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

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

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

bool型は整数int型のサブクラス。

print(issubclass(bool, int))
# True

boolTrueFalse1, 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文の条件式などで真偽のいずれかに判定される。

以下のオブジェクトは偽と判定される。

その他のオブジェクトはすべて真と判定される。例えば、空でない文字列は真。

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

次に説明するbool()を使うとオブジェクトをTrueFalseに変換できる。

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

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

'True'でも'False'でも、空でない文字列str型はすべてTrue。空文字列はFalse。文字列の内容に応じて変換するには次に説明する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

特定の文字列をTrue, Falseへ変換: strtobool()

上述のように、bool()は文字列'False'Trueに変換する。文字列の内容に応じて変換するにはstrtobool()を使う。

strtobool()はPython 3.11までは標準ライブラリのdistutils.utilモジュールに含まれていたが、Python 3.12でdistutilsパッケージが削除された。Python 3.12以降はサードパーティライブラリのsetuptoolsから使用可能(pipなどでインストールが必要)。

# For Python 3.11 and earlier
from distutils.util import strtobool

# For Python 3.12 and later (requires installing setuptools)
from setuptools._distutils.util import strtobool

以下の文字列が対象。大文字小文字の区別はなく'TRUE''True'なども'true'と同じ扱い。それ以外の文字列はエラーになる。

  • 真: 'y', 'yes', 't', 'true', 'on', '1'
  • 偽: 'n', 'no', 'f', 'false', 'off', '0'

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

以前は整数int1または0を返していたが、setuptoolsのバージョン75.3.2(2025/03/12リリース)からTrueまたはFalseを返すようになった。

from setuptools._distutils.util import strtobool

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

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

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

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

対象外の文字列を渡すとエラー(ValueError)。

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

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

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

対象文字列を追加したい場合は、setuptoolsでの実装を参考に自分で関数を定義すればよい。

def strtobool(val: str) -> bool:
    """Convert a string representation of truth to true (1) or false (0).

    True values are 'y', 'yes', 't', 'true', 'on', and '1'; false values
    are 'n', 'no', 'f', 'false', 'off', and '0'.  Raises ValueError if
    'val' is anything else.
    """
    val = val.lower()
    if val in ('y', 'yes', 't', 'true', 'on', '1'):
        return True
    elif val in ('n', 'no', 'f', 'false', 'off', '0'):
        return False
    else:
        raise ValueError(f"invalid truth value {val!r}")
source: util.py

大文字小文字を区別しないようにlower()メソッドで文字列を小文字に変換してから、in演算子で真偽それぞれの文字列候補のいずれかと一致するかを判定している。

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

True, Falsestr()で文字列'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

その他の型

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

# print(list(True))
# TypeError: 'bool' object is not iterable

関連カテゴリー

関連記事