Pythonのinによる要素の存在確認とループ処理での使い方をわかりやすく解説

スポンサーリンク
スポンサーリンク
amazon
スマイルSALE
--:--:--
ad. 価格範囲を指定して商品を探せます

inの概要

要素の存在確認とループ処理 Python予約語

in

概要 in(イン)は、リスト、辞書、セット、文字列などのコレクション(データのかたまり)の内部に、「特定の要素が格納されているか」を判定する所属演算子です。また、for 文と組み合わせることで、コレクションから「要素を1つずつ取り出して反復処理(ループ)を行う」ための制御構文の仕切り役としても機能します。

わかりやすく説明 in は、プログラムにおける「虫眼鏡(中身のチェック)」「コンベア(順番の取り出し)」という2つの強力な顔を持っています。「この会員リストの中に、田中さんは含まれているか?」を1行で一瞬で調べるとき(存在確認)や、「カゴの中にある果物を、手前から1個ずつ順番にすべてスキャンしていく」とき(for ループ)に、必ず使用される非常に身近なキーワードです。

  • 条件式(if 文など)の中で使うと、指定したデータが存在すれば True、存在しなければ False を論理値として返します。
  • not in という形で組み合わせることで、「含まれていないこと」を直接スマートに判定する条件式も作れます。
  • 辞書(dict)に対して使用した場合、デフォルトでは「値(バリュー)」ではなく「鍵(キー)」の中にそのデータが存在するかどうかを高速でスキャンします。

inの考え方をイメージで理解

inを使った要素の存在確認

あらかじめ用意したリストの中に、指定した特定の文字列データが含まれているかどうかを if 文でスキャンする最も基本的な例です。

# リスト内の要素の存在を確認
fruits = ["りんご", "バナナ", "オレンジ"]

if "バナナ" in fruits:
    # リストの中に「バナナ」が見つかったため(True)、ここを通過します
    print("バナナはリストに含まれています")

not inを使った要素の不在確認

「データが含まれていないこと」を検知したい場合に、not を前に挟むことで、直感的で読みやすい英語の構文のように条件式を記述できます。

# 要素がリストに含まれていないか確認
fruits = ["りんご", "バナナ", "オレンジ"]

if "イチゴ" not in fruits:
    # リストの中に「イチゴ」が存在しないため(True)、ここを通過します
    print("イチゴはリストに含まれていません")

inをforループと組み合わせて使う(反復処理)

for 変数 in コレクション: という組み合わせにより、コレクションの中身が尽きるまで、要素を自動的に先頭から1つずつ変数へ取り出してループを回す重要な使い方です。

# リストの要素を順に処理
fruits = ["りんご", "バナナ", "オレンジ"]

for fruit in fruits:
    # ループが回るたびに、fruit の中身が「りんご」→「バナナ」→「オレンジ」と切り替わります
    print(fruit)

辞書でinを使う

辞書(dict)に対して in を直接適用すると、登録されている「キー(見出し)」を対象にして存在チェックが行われます。

# 辞書のキーの存在確認
person = {"name": "太郎", "age": 25, "city": "東京"}

if "age" in person:
    # キーの中に「age」という登録を発見したため通過(値の 25 を見ているわけではありません)
    print(f"年齢の情報があります。値は {person['age']} です")

文字列でinを使う(部分一致判定)

文字列(str)に対して in を使用すると、テキスト全体の中に「指定したキーワード(部分文字列)」が埋め込まれているかを判定できます。

# 文字列の部分一致
text = "こんにちは、Pythonの世界へようこそ!"

if "Python" in text:
    print("文章の中に『Python』という単語が含まれています")
  • 大文字・小文字は厳密に区別されるため、"python" in text と書いた場合は False になります。

inの実践的な使用例

ユーザーから入力されたデータが、許可されたホワイトリスト(安全なデータ一覧)の中に正しく収まっているかをバリデーション(検証)する実務の手法です。

# 入力された曜日がリストに含まれているか確認
weekdays = ["月曜日", "火曜日", "水曜日", "木曜日", "金曜日"]
day = "土曜日"  # ユーザーからの入力を想定

if day in weekdays:
    print(f"{day} は平日です")
else:
    print(f"{day} は週末か、または正しい曜日ではありません")

inの注意点

  • 大規模なデータに対して、リスト(list)のまま in を使うと速度低下を引き起こす(超重要):リストに対する in の検索処理は、内部的には「先頭から順番に1個ずつ総当たりで探す(線形探索)」という泥臭い方法をとっています。そのため、リストの要素数が数万、数百万規模に膨れ上がると、in の判定にかかる時間が劇的に遅くなります。大量のデータから高速に検索を行いたい場合は、リストではなく、ハッシュアルゴリズムを用いて一瞬で検索を完了できる set(集合)dict(辞書) へデータを変換して in を使うのが実務の必須テクニックです。
    # 【実務での最適化例】
    huge_list = [i for i in range(10000000)] # 1千万個の巨大なデータリスト(検索が激重)
    huge_set = set(huge_list)                # 高速検索用に「セット型」へ変換
    
    # 探す処理
    if 9999999 in huge_set: # リストの100万倍以上のスピードで一瞬で True を弾き出します
        print("発見しました")
  • 辞書の値(バループ)を調べたいときは専用メソッドが必須:前述の通り、"太郎" in person のように直接書くだけでは、値にある「太郎」を検索することはできず False になります。値をターゲットにしたい場合は、必ず明確に .values() を後ろに繋いで指示する必要があります。

inのよくある質問

Q: 辞書の「値(バリュー)」の中に、特定のデータがあるかを調べるにはどう書けばいいですか?
A: 辞書名に対して .values() をドットで繋ぐことで、キーを除外した「値の一覧」を抽出できるため、これに対して in を使用します。

person = {"name": "太郎", "age": 25, "city": "東京"}

# 値のリストから「太郎」を検索
if "太郎" in person.values():
    print("値の中に『太郎』が存在します")

なお、同様にキーと値をセットにしたタプル形式で探したい場合は person.items() を利用します。

Q: `in` は数値のデータ型(int や float)に対して直接使用できますか?
A: 完全に不可能です。in は、内部に複数の要素を内包しているオブジェクト(反復可能オブジェクト:イテラブル)に対してのみ使用できる演算子です。そのため、単一の数値である if 5 in 500: のようなコードを書くと、中身を分解して探すことができないため TypeError: argument of type 'int' is not iterable というエラーが発生します。必ず、数値のリスト [500, 600] や範囲を示す range() を対象にしてください。

まとめ

in は、Pythonの特徴である「シンプルで英語のように読める美しいコード」を体現するための、存在確認と繰り返し制御に不可欠なコア予約語です。

  • コレクション内部の要素の有無を高速にスキャンし、True / False の論理値を出力する。
  • for 構文と連動することで、データの全要素をループ処理するためのイテレータとして動作する。
  • データ規模が大きいときは、リスト(低速)からセットや辞書(高速)へとコンテキストを切り替えてパフォーマンスを確保する。

Web APIから取得したJSONデータの解析や、データベースから抽出した大量のログデータのフィルタリングなど、実務のあらゆる場面において in は処理の起点となります。各データ型ごとの特性や検索スピード(計算量)の違いを意識し、ワンランク上の洗練されたコードを構築しましょう。