Pythonの真偽値bool型(True, False)と他の型との変換・判定
Pythonにおいて真偽値(真理値)はbool型のオブジェクトTrueとFalseで表される。比較演算子による比較の結果などはTrue, Falseで返され、if文の条件式などで使われる。
bool型はint型のサブクラス
True, Falseはbool型のオブジェクト。
print(type(True))
# <class 'bool'>
print(type(False))
# <class 'bool'>
bool型は整数int型のサブクラス。
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()を使って、TrueとFalseのリストからTrueの数をカウントできる。
print(sum([True, False, True]))
# 2
これをジェネレータ式と組み合わせると、条件を満たすリストの要素数をカウントできる。ジェネレータ式はリスト内包表記のジェネレータ版。リスト内包表記は[]、ジェネレータ式は()を使う。
- 関連記事: Pythonリスト内包表記の使い方
ジェネレータ式を関数の唯一の引数とする場合は()を省略できるので以下のように書ける。
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文の条件式などで真偽のいずれかに判定される。
以下のオブジェクトは偽と判定される。
- 偽であると定義されている定数:
NoneとFalse- 数値型におけるゼロ:
0,0.0,0j,Decimal(0),Fraction(0, 1)- 空のシーケンスまたはコレクション:
'',(),[],{},set(),range(0)組み込み型 - 真理値判定 — Python 3.13.3 ドキュメント
その他のオブジェクトはすべて真と判定される。例えば、空でない文字列は真。
if 'abc':
print('True!')
# True!
次に説明するbool()を使うとオブジェクトをTrueかFalseに変換できる。
他の型からbool型への変換: bool()
bool()を使うと、上述の真理値判定に従って、他の型のオブジェクトをbool型のTrueかFalseに変換できる。
'True'でも'False'でも、空でない文字列str型はすべてTrue。空文字列はFalse。文字列の内容に応じて変換するには次に説明するstrtobool()を使う。
print(bool('True'))
print(bool('False'))
print(bool('abc'))
# True
# True
# True
print(bool(''))
# False
整数intも浮動小数点数floatも複素数complexも、0でない数値はすべてTrue。0はFalse。
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
リストもタプルも集合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
NoneはFalse。
- 関連記事: PythonにおけるNoneの判定
print(bool(None))
# False
特定の文字列を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 ドキュメント
以前は整数intの1または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}")
大文字小文字を区別しないように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, Falseは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として扱われるため、Falseをstr()で文字列に変換してから再度bool()でbool型に戻すとTrueになる。注意。
print(bool(str(False)))
# True
その他の型
True, Falseはリストやタプルには変換できずエラーになる。空のリストに変換されたりはしない。
# print(list(True))
# TypeError: 'bool' object is not iterable