こんにちは!
プログラミングをしていて必ず出会う「論理演算」。
必ず出会うにも関わらず、取り掛かりにくいトピックですよね^^;
今回は、実際にPythonでコードを書きながら、論理演算のロジックと使い方を理解していきます!
論理演算とは
まずは、論理演算がどういったものなのかということを確認しておきましょう。
その前に、「命題」について知っておく必要があります。
命題とは
命題とは、「真(True)」か「偽(False)」で答えることができる条件のことをいいます。
例えば以下の画像を見てください。
「画像に映る人間は男性である」という質問は命題に該当し、その結果は「真」です。
「国旗は日本の国旗である」という命題は「偽」です。
この「真」や「偽」といった値はブール値(bool値)と呼ばれます。
プログラミングではint型やstring型といったデータ型がありますが、ブール値のデータ型はboolean型(True or False)です。
論理演算は2つのブール値に対して行う
2つのブール値を使って行う演算が論理演算です。
2つの命題の真偽の組み合わせの結果と考えることができます。
論理演算では、命題を組み合わせた結果が「真」か「偽」で返ってきます。
論理演算は、集合条件にも当てはめることができます。
集合は以下のような「ベン図」でよく表されます。
全体の集合の中で、ある条件で区別できる”A”という集団と、別のある条件で区別できる”B”という集団があります。
このように、「集合条件に合致するか?」という命題であると考えることで、集合にも論理演算を適用することができるのです。
それでは、演算の種類を見ていきましょう。
論理積(AND)
2つの条件(命題)が両方とも「真」の場合に「真」となります。
「AかつB」といった表現がされます。
ベン図で表すと、以下の通りです。AにもBにも当てはまっている部分がAとBの論理積です。
論理和(OR)
2つの条件のうち、いずれか1つでも「真」であれば「真」となります。
「AまたはB」と表現されます。
否定(NOT)
1つの条件に対して真偽値を反転させる演算です。
「Aではない」のように表現されます。
排他的論理和(XOR)
2つの条件のうち、どちらか一方の条件が「真」の場合にのみ「真」となります。
つまり、両方の条件が「真」の場合は「偽」となります。
排他的論理和についてはプログラミングで使う機会はそこまで多くないと思います。
なので、以下のPythonプログラミングの部分では割愛します^^;
正直言うと、あまり使いどころがわかりません、、、
情報処理技術者試験等では出題されたりするので、こういうのもあるんだと思ってもらえればと思います^^
一通り論理演算を確認できました。
それでは、実際にPythonでプログラムを書いて、論理演算の理解をより深めていきましょう。
Pythonで論理演算
if文で使う
論理演算の主戦場はif文の条件式です。
if文で複数の条件を組み合わせたいときに論理演算が登場します。
AND
「AもBも当てはまる場合」を表現するのがANDです。
以下の場合、「number1が5かつnumber2が5以上」の場合、print文が表示されます。
今回は両条件が「真」なので、print文が表示されます。
number1 = 5
number2 = 7
if number1 == 5 and number2 > 5:
print("条件を満たしています")
#Output
条件を満たしています
OR
「AかBのどちらかが当てはまる場合」を表現するのがORです。
以下では、number2 < 5は条件を満たしていません。
しかし、number1 == 5は条件を満たしているので、この条件式全体ではTrueとなります。
よって、print文が表示されます。
number1 = 5
number2 = 7
if number1 == 5 or number2 < 5:
print("条件を満たしています")
#Output
条件を満たしています
NOT
「Aではない」を表現するのがNOTです。
以下では、「number1 == 5ではない」という条件になっているので、「偽」となりprint文は表示されません。
number1 = 5
if not(number1 == 5):
print("条件を満たしています")
#Output
いろいろ組み合わせて使う
実際のプログラミングの場面では、これまで紹介した論理演算を複数組み合わせる場合も出てきます。
3つの条件を組み合わせてみましょう
number1 = 5
number2 = 7
number3 = 10
if number1 == 5 or number2 > 5 and number3 != 9:
print("条件を満たしています")
#Output
条件を満たしています
number3 != 9 というのは、number3が9ではないという命題です。今回number3は10なので、命題は「真」です。
さて、条件式全体の構造を見てみると、「A or B and C」となっています。
- A:number1 == 5
- B:number2 > 5
- C:number3 != 9
複数の論理演算が出てきたときは、先頭から順番に見ていけばOKです^^
上記の場合、A or Bという条件をDに置き換えます。Dの結果はTrueです。
- D:number1 == 5 or number2 > 5
次は、D and Cという条件を考えます。この結果もTrueになります。
なので、条件式全体でTrueとなり、print文が表示されます。
演算の順番は以下の通りです。
もう1つ例を見てみましょう。
number1 = 5
number2 = 7
number3 = 10
if not(number1 == 5 or number2 > 5) and number3 != 9:
print("条件を満たしています")
#Output
notで論理演算が括られています。こんな時でも焦る必要はありません。
基本的に、計算のときと同じように考えればいいと思います。
かっこ()があれば、その中の処理を優先させるのです。
上記の場合、number1 == 5 or number2 > 5 の演算を最初に行います(結果はTrue)。その後、得られた演算結果の否定を取るのです。
なので、not(number1 == 5 or number2 > 5) の結果はFalseになります。
DataFrameで使う
DataFrameでデータを抽出するときにも論理演算は使えます。
データ抽出の方法がわからないという方はこちらの記事を参考にしてみてください^^
ボストンの住宅価格データを使ってみていきましょう。
import pandas as pd
from sklearn.datasets import load_boston
data = load_boston()
df = pd.DataFrame(data.data, columns=data.feature_names)
ここから、条件をつけてデータを抽出していきます。
“CRIM”が0.05以上かつ”NOX”が0.5以下のデータを抽出してみます。
df.loc[(df["CRIM"] >= 0.05) & (df["NOX"] <= 0.5) ,:]
ここで注意してほしいのは、「and」の表現が「&」になっている点です。
この他、「or」は「|」、「not」は「~」で表現します。
*「|」は、shiftを押しながら¥のキーを押せば出ます。Back Spaceの左隣にあるケースが多いと思われます^^
df.loc[(df["CRIM"] >= 0.05) | ~(df["NOX"] <= 0.5) ,:]
この場合、”CRIM”は0.05以上という条件ですが、”NOX”は0.5以上の否定です。
なので、”NOX”は0.5未満ということになります。
条件式全体でみると、「”CRIM”が0.05以上または”NOX”が0.5未満」という条件になります。
まとめ
論理演算について、その理論とPythonでの使い方を解説しました。
組み合わせが増えるとわけがわからなくなりそうですが、あくまで数種類の論理演算組み合わせにすぎません。
算数の計算問題のように、順番に理解していけば、内容を把握できるはずですし、自分で演算式を書くこともできると思います^^
論理演算を知っていれば、プログラミングでできることも増えると思うので、是非とも習得したいですね!
ではでは👋