このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

【Python入門】inとnot inを利用して値の有無を調べる

inとnot inを利用して値の有無を調べる

 Pythonでは、in および not in 演算子を利用して、シーケンスや集合、辞書、文字列などのデータ構造に特定の値が含まれているかどうかを簡単かつ高速に判定できます。これらの演算子は「所属検査演算子」とも呼ばれ、コードの可読性や処理速度の向上に大いに貢献します。ここでは、innot in の基本的な使い方から、さまざまなデータ構造に対する応用例まで、具体的なプログラム例と共に解説していきます。

プログラムのダウンロード

 「ダウンロード」から、JupyterLab で実行できるサンプルプログラムがダウンロードできます。ファイルは、ESET Endpoint Securityでウイルスチェックをしておりますが、ダウンロードとプログラムの実行は自己責任でお願いいたします。

1.inとnot inの基本

1.1. 演算子の概要と基本文法

 in 演算子は、指定した値が対象のデータ構造に含まれている場合に True を返し、not in は含まれていない場合に True を返します。以下の表は、各演算子の動作をまとめたものです。

演算子意味
in値が対象に存在するときに True を返す。
not in値が対象に存在しないときに True を返す。

解説

 この基本文法は、集合やリスト、タプル、辞書、文字列など、ほとんどのデータ構造に対して共通です。たとえば、数値、文字列、タプルなど任意の型の値を対象に、存在確認を行うことができます。

1.2. 対象データ構造別の特徴

 innot in は、対象となるデータ構造によって探索アルゴリズムが異なります。特に、集合や辞書は内部でハッシュ法を用いており、非常に高速に探索を行えます。以下の表は、主要なデータ構造における探索の平均的な時間計算量と特徴を示しています。

データ構造平均探索時間ハッシュ法の利用順序の保証
リストO(n)なしあり
タプルO(n)なしあり
集合O(1)ありなし
辞書O(1)ありキーは順不同
文字列O(n)なしあり(インデックスで管理)

解説

  • 集合や辞書はハッシュ法を用いているため、値の存在確認が高速に行えます。
  • リストやタプル、文字列は順番に検索を行うため、要素数が多い場合は探索時間が長くなる可能性があります。

2.inとnot inを利用した実践例

2.1. コレクション内の要素チェックの例

 まずは、音楽バンドでよく使われる楽器の集合を例に、innot in を使って値の有無を調べるプログラムを示します。

サンプルプログラム

# 楽器の集合を定義
instruments = {'guitar', 'drums', 'bass'}

# 楽器が集合に含まれているかのチェック
print("piano in instruments:", 'piano' in instruments)   # False: 'piano' は含まれていない
print("drums in instruments:", 'drums' in instruments)     # True: 'drums' は含まれている

# not in を使ったチェック
print("flute not in instruments:", 'flute' not in instruments)  # True: 'flute' は含まれていない
print("bass not in instruments:", 'bass' not in instruments)      # False: 'bass' は含まれている

実行結果

piano in instruments: False
drums in instruments: True
flute not in instruments: True
bass not in instruments: False

解説

  • instruments という集合に対して、指定した楽器名が含まれているかを in 演算子で確認しています。
  • 結果として、存在する要素に対しては True、存在しない要素に対しては False が返されます。
  • not in はその逆の結果を返すため、存在しない場合に True が返ります。

2.2. ログイン認証における利用例

 次に、ユーザー認証をシンプルに実現する例を示します。ここでは、ユーザー名とパスワードの組み合わせをタプルとして管理する集合を用い、入力された認証情報が正しいかどうかを判定します。

サンプルプログラム

# 登録済みユーザーの認証情報を集合で管理(ユーザー名とパスワードのタプル)
registered_users = {('alice', 'pass123'), ('bob', 'secure456')}

# 認証情報のチェック(正しい組み合わせ)
user_input = ('bob', 'secure456')
if user_input in registered_users:
    print("認証成功: ログイン可能です。")
else:
    print("認証失敗: ユーザー名またはパスワードが間違っています。")

# 認証情報のチェック(誤った組み合わせの例)
user_input = ('alice', 'wrongpass')
if user_input in registered_users:
    print("認証成功: ログイン可能です。")
else:
    print("認証失敗: ユーザー名またはパスワードが間違っています。")

実行結果

認証成功: ログイン可能です。
認証失敗: ユーザー名またはパスワードが間違っています。

解説

  • registered_users には、正しいユーザー名とパスワードのペアがタプルとして格納されています。
  • 入力された認証情報もタプルにまとめ、in 演算子を用いて集合内に存在するかどうかを確認します。
  • 正しい情報であれば True が返され、認証が成功します。誤った情報の場合は False となり、ログインは拒否されます。

2.3. 文字列に対するinとnot inの利用例

最後に、文字列を対象に特定の文字が含まれているかどうかを調べる例を示します。

サンプルプログラム

# 対象となる文字列
language = "programming"

# 文字の存在チェック
print("'m' in language:", 'm' in language)        # True: 'm' は "programming" に含まれている
print("'z' in language:", 'z' in language)          # False: 'z' は含まれていない

# not in を使ったチェック
print("'r' not in language:", 'r' not in language)  # False: 'r' は含まれている
print("'x' not in language:", 'x' not in language)  # True: 'x' は含まれていない

実行結果

'm' in language: True
'z' in language: False
'r' not in language: False
'x' not in language: True

解説

  • 文字列もイテラブルなオブジェクトであるため、in 演算子を用いて個々の文字の存在を確認できます。
  • この例では、文字 'm''r' が文字列 "programming" に含まれているかどうかを判定し、期待される結果を得ています。

まとめ

 ここでは、innot in 演算子を用いて、集合やリスト、タプル、文字列などのデータ構造に対して値の有無を効率的に判定する方法について解説しました。基本的な文法と各データ構造ごとの特徴を理解することで、条件分岐や認証処理、文字列操作など、さまざまな場面でこれらの演算子を効果的に利用できます。これにより、コードの可読性と実行効率が向上し、より堅牢なプログラムの実装が可能となります。