in 演算子

生田 陸人
LuaGate エンジニア / 現役エンジニア
編集 LuaGate編集部

in 演算子 とは

要素や部分文字列が含まれるかを in で判定します。本レッスンでは、in 演算子 の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。

in 演算子で「含まれているか」を判定する

in 演算子は、ある要素がコレクション (リスト、タプル、set、文字列、辞書のキー) に含まれているかを判定し、bool を返す演算子です。Python の中でもとくに直感的でよく使われる演算子のひとつで、ループや条件分岐とセットで頻出します。「ユーザーがブラックリストに入っているか」「文字列に特定キーワードが含まれているか」など、日常のアプリ開発でほぼ毎日使うレベルです。

対になる not in は「含まれていないか」を判定する演算子で、if x not in allowed: のように書くと「許可されていないものを弾く」というガード処理が自然に表現できます。同じ判定を not (x in allowed) と書くこともできますが、not in のほうが読みやすいので慣習として推奨されます。

in の戻り値は常に bool です。要素そのものを返すわけではないので、index が欲しいときは list.index()enumerate を使います。

各コレクションでの動き

in はコレクションの種類によって挙動が少しずつ異なります。リストやタプルでは「要素と一致するか」、文字列では「部分文字列として含まれるか」、辞書では「キーに存在するか」を判定します。次のとおりです。

Python

# リスト・タプル print(3 in [1, 2, 3]) # True print("banana" in ("apple", "banana")) # True # 文字列 print("py" in "python") # True print("PY" in "python") # False (大文字小文字を区別) # 辞書 (キーをチェック) user = {"name": "Alice", "age": 30} print("name" in user) # True print("Alice" in user) # False (値はチェックしない)

辞書の in は「キー」しか見ない点に注意です。値の存在チェックがしたいなら "Alice" in user.values() のように書きます。setin をサポートし、内部的にハッシュを使うので大量データでも高速に判定できます。

diagram (will load when visible)

リスト・タプルの in は線形探索なので大規模なデータでは遅くなります。頻繁にチェックするなら set に変換しましょう。

よくある使い方

inif 文と組み合わせて条件分岐に使うのが王道です。たとえば「曜日が休日リストに含まれているか」を判定するなら次のように書けます。

Python

holidays = {"土", "日"} day = "日" if day in holidays: label = "休み" else: label = "出勤" print(label) # 休み

ループとも組み合わせ可能で、for x in iterable:in は同じキーワードですが意味は別物です。for 文中の in は反復処理、if x in iterable:in はメンバーシップ判定なので役割が違います。

よくある間違い

in でつまずきやすいのは次の 3 点です。1 つめは「辞書で値を探そうとする」ケースで、"Alice" in {"name": "Alice"}False になります。2 つめは「Nonein」を組み合わせるケースで、None in [None]True ですが None in {}False なので意図しない結果になることがあります。3 つめは「文字列の部分一致」を意図せず使ってしまうケースで、"a" in "banana"True です。完全一致が欲しいなら == を使います。

Python

users = ["Alice", "Bob"] print("Ali" in users) # False (要素は文字列単位) print("Ali" in users[0]) # True (Alice の部分文字列)

リストと文字列で in の比較粒度が違うことを忘れずに。リストは要素単位、文字列は部分一致です。

やってみよう

今回の課題は、要素 target がリスト items に含まれているかを判定する関数 contains(items, target) を書くことです。中身は return target in items の 1 行で済みます。書けたら、文字列のリストや数値のリストを渡して、in の挙動を試してみてください。応用として not in を使った「含まれない判定」も書いてみると、ガード処理の感覚がつかめます。set に変換して in を呼ぶ書き方も知っておくと、データが大きいときの最適化に役立ちます。たとえば 10 万件のリストで何度も in を呼ぶより、set(items) に変換してから in を使うほうが圧倒的に速くなります。

速度が気になるシーンでは set への変換コストと in の呼び出し回数を天秤にかけて選びましょう。

よくある質問

Q. このトピックは Python 以外の言語でも同じ書き方ですか?

A. 考え方は他言語と共通ですが、構文や標準ライブラリは異なります。Python はインデントでブロックを表し、コロン + 改行で構造を作るのが特徴です。他言語に移行する際は基本概念を維持しつつ、構文の差分を意識して書き換えると混乱が少ないです。

Q. 実行してエラーが出た場合の対処は?

A. エラーメッセージの最後の行(TypeError や NameError などの型)から原因と該当行を確認します。Python はトレースバックが下から上に読むと「呼び出し元 → 内部」の順で辿れます。print や IDE のデバッガで途中の変数を確認すると原因が見えてきます。

Q. 次のステップで何を学ぶべきですか?

A. 本レッスンの内容を理解できたら、本文の「やってみよう」を実装し、章末クイズに進むのがおすすめです。さらに自分のミニアプリ(電卓・todo・スコア集計など)に応用するとスキルが定着します。詰まったら本文の H2 セクションに戻って読み返してください。

次のレッスン

次は 連鎖比較 で、要素や部分文字列が含まれるかを in で判定します を学びます。

事前確認 — 進む前に次の 3 つができることを確認しましょう。

  1. in 演算子 の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. in 演算子 とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン

要件

  1. in 演算子を使って判定する
  2. 戻り値は True / False
  3. 1 行で書ける

入出力例

test-cases.txt

contains([1,2,3], 2)true contains([1,2,3], 5)false contains(["apple","banana"], "banana")true contains([], 1)false contains([null,1], null)true

ヒント

main.py
main.py
学習モード

メモ

in 演算子

⌘S で保存