Pythonでコードを書いていると、「2つの値が等しくないか」を判定したい場面が頻繁に出てきます。たとえば、ユーザーの入力値が期待する値と異なるときに処理を分岐させたり、特定の条件を満たさない要素だけを抽出したりするケースです。
このような場面で使うのが、ノットイコール演算子(!=)です。!=演算子とは、左辺と右辺の値が等しくないかを判定する比較演算子で、等しくなければTrue、等しければFalseを返します。
この記事では、Pythonのノットイコール(!=)演算子の基本的な書き方から、if文やwhile文、リスト内包表記での実践的な使い方まで、サンプルコード付きで解説していきます。
Pythonのノットイコール(!=)演算子の使い方
Pythonのノットイコール(!=)演算子は、2つの値が等しくないかを判定する比較演算子です。基本的な書き方は、以下の通りです。
a != b # aとbが等しくなければTrue、等しければFalse
!=演算子は数値や文字列、リスト、辞書など、組み込みの主要なデータ型に対して使用できます。ただし、比較の結果は各データ型の等価性の定義に依存する点には注意が必要です。ここでは、以下の4つの活用パターンを解説します。
- 数値や文字列を比較する
- if文で条件分岐する
- while文でループを制御する
- リスト内包表記でフィルタリングする
それぞれの活用パターンには異なる特徴があり、実務のさまざまな場面で役立ちます。
それでは各パターンについて、解説していきます。
数値や文字列を比較する
!=演算子の最も基本的な使い方は、2つの値を直接比較することです。数値どうしの比較では、値そのものが異なればTrueを返します。
x = 10
y = 20
print(x != y) # True(10と20は異なる)
print(x != 10) # False(10と10は等しい)
上記のコードでは、変数xとyに異なる数値を代入し、!=演算子で比較しています。x != yはTrueを返し、x != 10はFalseを返します。
文字列の比較では、大文字と小文字が区別される点に注意が必要です。以下のサンプルコードで確認してみましょう。
name1 = "Python"
name2 = "python"
print(name1 != name2) # True(大文字・小文字が異なる)
print("hello" != "hello") # False(完全に一致)
上記のコードでは、「Python」と「python」を比較しています。Pythonでは大文字と小文字を別の文字として扱うため、!=演算子はTrueを返します。大文字・小文字を区別せずに比較したい場合は、簡易的にはlower()メソッドで統一する方法が有効です。Unicodeの特殊な文字(例:ドイツ語の「ß」)を含む文字列でより厳密に比較したい場合は、casefold()メソッドの利用が推奨されます。
なお、浮動小数点数(float型)の比較では、内部的な表現誤差によって意図しない結果になることがあります。詳しくは記事下部の「浮動小数点数(float)を!=で比較しても大丈夫ですか?」をご覧ください。
if文で条件分岐する
!=演算子は、if文の条件式で頻繁に使われます。特定の値と異なる場合にのみ処理を実行したいときに便利です。
user_role = "guest"
if user_role != "admin":
print("管理者権限が必要です")
else:
print("管理画面を表示します")
上記のコードでは、user_roleが「admin」と異なる場合に「管理者権限が必要です」と表示し、一致する場合は「管理画面を表示します」と表示します。
elif文と組み合わせることで、複数の条件を段階的にチェックすることも可能です。以下のサンプルコードでは、ステータスコードに応じた処理を分岐しています。
status = "error"
if status != "success" and status != "pending":
print("エラーが発生しました")
elif status != "success":
print("処理中です")
else:
print("処理が完了しました")
上記のコードでは、and演算子を使って複数の!=条件を組み合わせています。statusが「success」でも「pending」でもない場合にエラーメッセージを表示する構成です。
while文でループを制御する
!=演算子をwhile文の条件式に使うことによって、特定の値になるまでループを継続する処理を実装できます。ユーザー入力の検証など、終了条件が特定の値と一致するかどうかで決まる場面で有効です。
user_input = ""
while user_input != "quit":
user_input = input("コマンドを入力してください(終了はquit): ")
if user_input != "quit":
print(f"入力値: {user_input}")
print("プログラムを終了します")
上記のコードでは、ユーザーが「quit」と入力するまでループが継続します。!=演算子がwhile文の条件として機能し、入力値が「quit」と等しくない間はループ内の処理を繰り返します。
一方、カウンターで回数を制御する場合は、!=ではなく「<」や「<=」といった単調な比較演算子を使う方が安全です。!=でカウンタを比較すると、加算幅や更新タイミングのズレで目標値を飛び越えた際に無限ループに陥る可能性があります。
count = 0
target = 5
# 推奨: 単調比較を使う
while count < target:
print(f"現在のカウント: {count}")
count += 1
print(f"カウントが{target}に到達しました")
!=は「特定の値になったら止める」という意図が明確な場面で使い、カウンタによる回数制御には<や<=を使うと覚えておきましょう。
リスト内包表記でフィルタリングする
リスト内包表記とは、既存のリストから条件に合う要素だけを抽出して新しいリストを生成するPythonの構文です。!=演算子を条件式に使うことによって、特定の値を除外したリストを簡潔に作成できます。
numbers = [1, 2, 3, 2, 4, 2, 5]
filtered = [n for n in numbers if n != 2]
print(filtered) # [1, 3, 4, 5]
上記のコードでは、リストnumbersから値が2の要素を除外した新しいリストfilteredを生成しています。!=演算子がフィルタ条件として機能し、2以外の全ての要素が抽出されます。
文字列のリストに対しても同様のフィルタリングが可能です。以下のサンプルコードでは、空文字列を除外しています。
words = ["hello", "", "world", "", "python"]
non_empty = [w for w in words if w != ""]
print(non_empty) # ['hello', 'world', 'python']
上記のコードでは、リストwordsから空文字列("")を除外しています。データのクレンジング処理など、不要な値を取り除く場面で!=演算子とリスト内包表記の組み合わせは非常に実用的です。
Pythonのノットイコール(!=)とis notの違い
Pythonには、!=演算子のほかにis notという演算子があります。どちらも「等しくない」を判定する点は共通していますが、比較する対象が異なります。!=演算子は「値」を比較し、is not演算子は「オブジェクトの同一性(同じオブジェクトを指しているか)」を比較します。
以下は、!=とis notの違いをまとめた比較表です。
| 項目 | !=演算子 | is not演算子 |
|---|---|---|
| 比較対象 | 値が等しいか | 同じオブジェクトを指しているか |
| 判定基準 | 各データ型の等価性の定義(内部的には__eq__や__ne__) | オブジェクトの同一性 |
| 主な用途 | 数値・文字列・リストの比較 | None等のシングルトンオブジェクトとの比較 |
なお、!=演算子の内部動作は厳密にはシンプルではありません。Pythonは「rich comparison」と呼ばれる仕組みで比較を行い、__ne__メソッドの実装がない場合は__eq__メソッドの結果を反転するなど、段階的に評価されます。初学者の段階では「値が等しいかを判定する」という理解で十分ですが、カスタムクラスでは比較の挙動をオーバーライドできる点は覚えておきましょう。
この違いを理解するために、以下のサンプルコードを確認してみましょう。
a = [1, 2, 3]
b = [1, 2, 3]
c = a
# 値の比較(!=)
print(a != b) # False(値は同じ)
print(a != c) # False(値は同じ)
# 同一性の比較(is not)
print(a is not b) # True(別のオブジェクト)
print(a is not c) # False(同じオブジェクト)
上記のコードでは、aとbは同じ値を持つリストですが、それぞれ別のオブジェクトとして生成されています。そのため、!=演算子ではFalse(値は等しい)、is not演算子ではTrue(別のオブジェクト)と判定されます。一方、cはaと同じオブジェクトを参照しているため、どちらの比較でもFalseが返ります。
Noneとの比較では、!=ではなくis notを使うことがPythonの公式スタイルガイド(PEP 8)で推奨されています。
Comparisons to singletons like None should always be done with is or is not, never the equality operators.
(Noneのようなシングルトンとの比較は、常にisまたはis notで行うべきであり、等価演算子を使うべきではありません)
出典:PEP 8 – Style Guide for Python Code
以下のサンプルコードで確認してみましょう。
value = None
# 推奨される書き方
if value is not None:
print("値が設定されています")
# 非推奨の書き方(動作はするが推奨されない)
if value != None:
print("値が設定されています")
上記のコードでは、どちらの書き方でも同じ結果になりますが、is notを使う方が推奨されます。Noneはプログラム中に1つしか存在しないシングルトンオブジェクトであるため、同一性の比較が最も自然であること、そして==や!=はクラス側で__eq__や__ne__をオーバーライドできるため、意図しない比較結果が返る可能性があることが主な理由です。
実務では、Noneとの比較にはis notを使い、値の比較には!=を使うと覚えておきましょう。
Pythonのノットイコール(!=)に関するよくある質問
Pythonの!=演算子と==演算子の違いは何ですか?
!=演算子は「等しくない」ことを判定し、==演算子は「等しい」ことを判定する比較演算子です。通常の組み込み型(数値・文字列・リストなど)での比較では、両者は逆の結果を返します。
| 演算子 | 意味 | 使用例 | 結果 |
|---|---|---|---|
| != | 等しくない | 10 != 20 | True |
| == | 等しい | 10 == 20 | False |
条件を反転させたい場面に応じて、どちらの演算子を使うか選択しましょう。なお、カスタムクラスで__eq__や__ne__をオーバーライドした場合、両者の結果が厳密に逆になるとは限らない点には注意が必要です。
浮動小数点数(float)を!=で比較しても大丈夫ですか?
浮動小数点数の!=比較は、内部的な表現誤差によって予期しない結果になる可能性があるため注意が必要です。たとえば、0.1 + 0.2 != 0.3 はTrueを返します。これは計算結果が厳密な0.3ではなく、0.30000000000000004のような値として表現されることがあるためです。
浮動小数点数を比較する場合は、標準ライブラリのmath.isclose()関数を使って許容誤差を指定する方法が推奨されます。
import math
a = 0.1 + 0.2
b = 0.3
print(not math.isclose(a, b)) # False(許容誤差内で等しい)
math.isclose()は、2つの値が許容誤差の範囲内で等しいかを判定する関数です。浮動小数点数の等価・非等価比較を行う場合は、この関数の利用を検討してください。
Python 2の<>演算子はPython 3で使えますか?
Python 2では!=のほかに<>演算子でもノットイコールを表現できましたが、Python 3では<>演算子は削除されており、使用するとSyntaxErrorが発生します。Python 3で「等しくない」を判定する場合は、!=演算子のみを使用してください。
- Python 2: !=と<>の両方が使用可能
- Python 3: !=のみ使用可能(<>は削除済み)
現在はPython 3が主流であるため、新しくコードを書く場合は!=演算子を使えば問題ありません。
※上記コンテンツの内容やソースコードはAIで確認・デバッグしておりますが、間違いやエラー、脆弱性などがある場合は、コメントよりご報告いただけますと幸いです。
ITやプログラミングに関するコラム
PythonをWebで実行する方法
共通テスト「情報Ⅰ」2年目で変わる、日本の教育と学び方
gitでブランチ(branch)を切り替える方法
git cloneでブランチを指定する方法
64GBのメモリが必要な人・不要な人の特徴
PCを再起動するコマンド一覧
CapsLock以外で大文字になる原因【Windows編】
パソコンで大文字になるのを解除する方法
面白いAIの活用事例を業界別に紹介
Gitでcommit(コミット)を取り消す方法
ITやプログラミングに関するニュース
サイボウズがkintone AIを正式提供、β版から約1年を経てクレジット制を導入
ロゼッタのラクヤクAIがCSRドラフト作成期間を90%以上短縮、従来4週間を約2日に
AI CROSSが不動産業界向け生成AI伴走支援を開始、アスコットの業務AI実装を実践サポート
日本情報クリエイトが「オーナー提案AIロボⅡ」売買査定を刷新、月1万円からW査定が回数無制限に
Wur株式会社がAI新規事業診断サービス「MVP事業診断レポート」をリリース、12の質問で事業構想を約10分で分析
バトンズがM&A専門家向け「AI概要書」β版を提供開始、企業概要書のドラフトを最速3分で自動生成
SCSKが観光DXサービス「Connexia」を開発、首里城公園でNFT活用の周遊促進が始動
Verdent AI発表、エンジニア不要でソフトウェアを構築する「AIエンジニアリングチーム」が登場
ゼネラルBREXAテクノロジーが外食・小売向けAIサービス「aimana」を開発、店長の意思決定をデータで支援
田中組がKencopa工程AIエージェント製品版を先行利用開始、建設現場の工程管理属人化を解消へ
