in 演算子
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() のように書きます。set も in をサポートし、内部的にハッシュを使うので大量データでも高速に判定できます。
リスト・タプルの
inは線形探索なので大規模なデータでは遅くなります。頻繁にチェックするならsetに変換しましょう。
よくある使い方
in は if 文と組み合わせて条件分岐に使うのが王道です。たとえば「曜日が休日リストに含まれているか」を判定するなら次のように書けます。
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 つめは「None と in」を組み合わせるケースで、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 つができることを確認しましょう。
- in 演算子 の要点を自分の言葉で説明できる
- このレッスンの最小コード (または操作手順) を見ずに書ける
- 練習問題やクイズで間違えた箇所を読み直して理解した
理解度チェック (30 秒)
Q. in 演算子 とは何か、1 文で説明してください。
A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。
関連レッスン
要件
- in 演算子を使って判定する
- 戻り値は True / False
- 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