こんにちは、PyQサポートです。
今回は、「複数の条件をandで繋いだときに期待する結果にならない」という問題の原因を解説します。
質問:複数の条件をandで繋いだときに期待する結果にならない理由を教えてください。
fruit_list = ["リンゴ", "ミカン", "ブドウ", "バナナ"] if "リンゴ" and "レモン" and "バナナ" in fruit_list: print("リンゴとレモンとバナナのセットが入っています。") else: print("リンゴとレモンとバナナのセットは入っていません。")
実行結果
リンゴとレモンとバナナのセットが入っています。
fruit_list には "レモン" が入っていないのに、"レモン" が入っていると判定されてしまいました。
複数の条件をandで繋いだときに期待する結果にならない理由を教えてください。
回答: andを使った条件式の書き方が正しくないためです
原因は、and を使った条件式の書き方が正しくないためです。
if "リンゴ" and "レモン" and "バナナ" in fruit_list: の意味
if "リンゴ" and "レモン" and "バナナ" in fruit_list:
というif文は、以下の3つの条件を別々にチェックします。
"リンゴ"
: "リンゴ" という文字列を評価"レモン"
: "レモン" という文字列を評価"バナナ" in fruit_list
: "バナナ" という文字列が fruit_list に含まれるかを評価
この3つの条件を and で繋いでいます。
Pythonでは文字列のみを評価した場合、文字列が空であるかどうかを判定します。
word1 = "あ" if word1: print("word1は文字があります。") else: print("word1は空っぽです。") word2 = "" if word2: print("word2は文字があります。") else: print("word2は空っぽです。")
実行結果
word1は文字があります。 word2は空っぽです。
このため、 "レモン" のみで評価すると fruit_list に含まれるかどうかに関わらず True となってしまいます。
複数の文字列がリストに含まれるかどうかをチェックするには
本来やりたい 3つの文字列が fruit_list に含まれるかどうかをチェックする ためには、以下のように3つの条件を and で繋ぎます。
"リンゴ" in fruit_list
: "リンゴ" という文字列が fruit_list に含まれるかを評価"レモン" in fruit_list
: "レモン" という文字列が fruit_list に含まれるかを評価"バナナ" in fruit_list
: "バナナ" という文字列が fruit_list に含まれるかを評価
正しいif文は以下のようになります。
fruit_list = ["リンゴ", "ミカン", "ブドウ", "バナナ"] if "リンゴ" in fruit_list and "レモン" in fruit_list and "バナナ" in fruit_list: print("リンゴとレモンとバナナのセットが入っています。") else: print("リンゴとレモンとバナナのセットは入っていません。")
実行結果
リンゴとレモンとバナナのセットは入っていません。
このように、andで繋いだ個々の条件が正しくなるようにすることで、正しく判定されます。
まとめ
今回は、「複数の条件をandで繋いだときに期待する結果にならない」という問題の原因を解説しました。
英語では and の使い方が正しいように見えても、Pythonでは正しくない場合があるので、注意が必要です。
and を使う場合は、andで繋がれた個々の条件が正しいことを確認してみましょう。