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