ユーニックス総合研究所

  • home
  • archives
  • python-bool-hanten

Pythonのbool値を反転させる方法【TrueからFalse, FalseからTrueへ】

  • 作成日: 2022-05-24
  • 更新日: 2023-12-25
  • カテゴリ: Python

Pythonのbool値を反転させる方法

Pythonではbool値(論理値)を扱えます。
これはTrueやFalseなどです。
この論理値を反転させるにはnot演算子を使います。

関連記事

頭が悪い人のPythonのevalの使い方
頭がいい人のPythonのexitの使い方
状態遷移による文字列パースのテクニック【Python】

頭が悪い人のPythonのevalの使い方
頭がいい人のPythonのexitの使い方
状態遷移による文字列パースのテクニック【Python】

TrueをFalseに反転

Trueにnot演算子を使うとその結果はFalseになります。

print(not True)  # False  

FalseをTrueに反転

Falseにnot演算子を使うとその結果はTrueになります。

print(not False)  # True  

notを使ったテクニック「bool型への強制変換」

関数などを作って関数の中でたとえば整数で計算したとします。
それでその計算結果をboolで返したいとなったときに、その整数の計算結果をbool型にしておくと何となく気持ちがいいです。
そういう時は「not演算子の2回掛け」が良く行われます。

たとえば↓を見てください。

print(not not 1)  # True  

↑の例では整数1notを2回かけて結果をboolにしています。
まず1回目のnotで整数1はFalseに変換されます。
そして2回目のnotでFalseがTrueになります。
こうすると真になる整数を強制的にTrueにすることができます。

Pythonではbool値は計算式の文脈で整数として評価されますので、こういった変換は必要ないです。
しかし関数の結果などを真偽値で返したい、その方がきれい、という場合などはこういったテクニックが使われます。

リスト(配列)内のbool値をすべて反転

配列内のbool値をすべて反転する処理です。
map()を使うと↓のように書けます。

l1 = [True, False, True, False]  
l2 = list(map(lambda x: not x, l1))  
print(l2)  
# [False, True, False, True]  

map()は第1引数の関数を第2引数のリストの要素に適用する関数です。
↑の第1引数のラムダ式は引数xnotで反転させます。
その反転結果が新しいリストに格納されます。
結果、l2には反転された値が格納されます。

↑の例ではリストを新規に作っていましたが既存のリストを利用したい場合は↓のようにも書けます。

l1 = [True, False, True, False]  
for i, x in enumerate(l1):  
    l1[i] = not x  

print(l1)  
# [False, True, False, True]  

enumerate()はリストから添え字と要素を同時に取り出します。
↑の例では要素xを反転させてl1[i]に保存しています。
これも結果は同様に値が反転したリストになります。

あるいはリスト内包表記を使う場合は↓のようにも書けます。

l1 = [True, False, True, False]  
l2 = [not x for x in l1]  
print(l2)  
# [False, True, False, True]  

↑の例では新しくl1からl2のリストを作っています。
要素の値は反転されています。

辞書の値をすべて反転させたい場合は辞書内包表記が使えます。

d1 = {'a': True, 'b': False}  
d2 = { k: not v for k, v in d1.items() }  
print(d2)  
# {'a': False, 'b': True}  

あるいは↓のようにfor文で愚直に書く方法もあります。

d1 = {'a': True, 'b': False}  

for k, v in d1.items():  
    d1[k] = not v  

print(d1)  
# {'a': False, 'b': True}  

↑の場合は辞書を新しく作成せずに既存の辞書を再利用しています。

all()の結果を反転

組み込み関数のall()はリストの要素がすべて真ならTrueを返します。
この結果をnotで反転するとどうなるでしょうか。

l = [True, True, True]  
print(all(l))  # True  
print(not all(l))  # False  

l = [True, False, True]  
print(all(l))  # False  
print(not all(l))  # True  

all()は「すべて真ならTrue」です。
これを反転すると「偽が1つでもあればTrue」になります。

any()の結果を反転

組み込み関数のany()はリストのいずれかの要素が真ならTrueを返します。
この結果を反転すると……

l = [False, True, False]  
print(any(l))  # True  
print(not any(l))  # False  

l = [False, False, False]  
print(any(l))  # False  
print(not any(l))  # True  

any()は「いずれかが真ならTrue」です。
これを反転すると「すべて偽ならTrue」になります。

おわりに

今回はPythonのbool値の反転を解説しました。
bool値を反転するケースはけっこうあるので押さえておいて損はないですね。

🦝 < 反転してやる!

🐭 < グレてしまった