Pythonで文字の内容から真偽値の判定をする

Pythonで真偽値の判定をするとき、偽と定義されていないオブジェクトは真と判定されます。Falseという文字列も真になります。そこで、文字列の中身から真偽値を判定します。

目次

  1. strtobool関数で真偽値を判定する
  2. 文字列の意味から真偽判定する実施例

strtobool関数で真偽値を判定する

docutilsモジュールのstrtobool関数で、文字列から真偽のどちらが書かれているかを判定します。

from distutils.util import strtobool

res = strtobool(val)
変数 内容
val   真偽を判定するオブジェクト。
res int 判定結果。真なら1、偽なら0。

公式のドキュメントによれば、y、yes、t、true、on、1は真で、n、no、f、false、off、0が偽と判定されるということです。判定できない文字列はエラーになります。

文字列の意味から真偽判定する実施例

試してみましょう。環境はPython 3.7です。

>>> from distutils.util import strtobool
>>> strtobool('True')
1
>>> strtobool('False')
0

>>> strtobool('true')
1
>>> strtobool('false')
0

>>> strtobool('TRUE')
1
>>> strtobool('FALSE')
0

>>> strtobool('T')
1
>>> strtobool('F')
0

>>> strtobool('t')
1
>>> strtobool('f')
0

>>> strtobool(True)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Program Files\Python37\lib\distutils\util.py", line 296, in strtobool
    val = val.lower()
AttributeError: 'bool' object has no attribute 'lower'
>>> strtobool(False)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Program Files\Python37\lib\distutils\util.py", line 296, in strtobool
    val = val.lower()
AttributeError: 'bool' object has no attribute 'lower'

大文字と小文字はあまり気にしなくても良いですね。

strでなくてbool型そのものを引数に入れると、エラーになります。。

>>> from distutils.util import strtobool
>>> strtobool('Yes')
1
>>> strtobool('No')
0

>>> strtobool('yes')
1
>>> strtobool('no')
0

>>> strtobool('Y')
1
>>> strtobool('N')
0

>>> strtobool('y')
1
>>> strtobool('n')
0

YesとNoも大文字と小文字は気にしなくても良さそうです。

>>> from distutils.util import strtobool
>>> strtobool('ON')
1
>>> strtobool('OFF')
0

>>> strtobool('On')
1
>>> strtobool('Off')
0

>>> strtobool('on')
1
>>> strtobool('off')
0

OnとOffも大文字と小文字は気にしなくても良さそうです。

>>> from distutils.util import strtobool
>>> strtobool(1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Program Files\Python37\lib\distutils\util.py", line 296, in strtobool
    val = val.lower()
AttributeError: 'int' object has no attribute 'lower'
>>> strtobool(0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Program Files\Python37\lib\distutils\util.py", line 296, in strtobool
    val = val.lower()
AttributeError: 'int' object has no attribute 'lower'

>>> strtobool('1')
1
>>> strtobool('0')
0

>>> strtobool('1')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Program Files\Python37\lib\distutils\util.py", line 302, in strtobool
    raise ValueError("invalid truth value %r" % (val,))
ValueError: invalid truth value '1'
>>> strtobool('0')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Program Files\Python37\lib\distutils\util.py", line 302, in strtobool
    raise ValueError("invalid truth value %r" % (val,))
ValueError: invalid truth value '0'

>>> strtobool('-1')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Program Files\Python37\lib\distutils\util.py", line 302, in strtobool
    raise ValueError("invalid truth value %r" % (val,))
ValueError: invalid truth value '-1'

1と0ですが、intの1と0ではエラーになります。というか、わざわざstrtoboolを通す必要がありませんね。

日本語として入力できる1と0もエラーになります。

'-1'もエラーですね。

広告

Pythonカテゴリの投稿