Python学習チャンネル by PyQ

Pythonのオンライン学習プラットフォームPyQのオフィシャルブログです

【Pythonお悩み解決】複数の条件をandで繋いだときに期待する結果にならないのはなぜ?

こんにちは、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で繋がれた個々の条件が正しいことを確認してみましょう。

Copyright ©2017- BeProud Inc. All rights reserved.