Python | データ構造:list.remove

Python
スポンサーリンク

list.remove の概要(値で指定して最初の一致だけ削除)

list.remove は、リスト内の「指定した値」と一致する最初の要素を削除するメソッドです。位置(インデックス)ではなく値で指定する点が特徴で、元のリストがその場で変更されます。戻り値はありません(None)。同じ値が複数ある場合でも、最初のひとつだけが消えます。

fruits = ["apple", "banana", "cherry", "banana"]
fruits.remove("banana")
print(fruits)  # ["apple", "cherry", "banana"] (最初の "banana" だけ削除)
Python

基本動作とエラーの扱い(ここが重要)

値で指定し、最初の一致のみ削除される

remove(value) は、左から順に探して最初の一致を1件だけ削除します。2件目以降はそのまま残ります。確実に1件だけ消したいときに向きます。

nums = [10, 20, 20, 30]
nums.remove(20)
print(nums)  # [10, 20, 30]
Python

見つからない値は ValueError になる

指定した値が存在しないときは ValueError が出ます。事前に含まれるかを確認するか、try/except で安全に扱います。

items = ["a", "b"]
if "c" in items:
    items.remove("c")  # 実行されない(安全)
# または
try:
    items.remove("c")
except ValueError:
    pass  # 無視または代替処理
Python

戻り値は None(結果はリストそのものに反映)

remove の戻り値を変数に入れないでください。削除後の状態は元のリストを見れば分かります。

x = [1, 2, 3]
ret = x.remove(2)
print(ret)  # None
print(x)    # [1, 3]
Python

pop・del との違いと使い分け(誤用しやすい重要ポイント)

値を消すときは remove、位置で消すときは pop または del を使います。pop は「削除した値を返す」ため、取り出しながら使う場面に向きます。del は文(ステートメント)で、戻り値なし。スライス削除などの“一括”に便利です。

items = ["a", "b", "c", "b"]

items.remove("b")  # 値指定で最初の "b" を削除(None)
print(items)       # ["a", "c", "b"]

v = items.pop(1)   # 位置指定で削除しつつ返す → "c"
print(v, items)    # "c" ["a", "b"]

del items[0]       # 位置指定で削除(戻り値なし)
print(items)       # ["b"]
Python

「値を指定して消したい」なら remove、「何番目を消したい」なら pop/del、「値を使いながら削除」なら pop を選ぶのが基本です。


複数削除や条件削除の定番パターン(深掘り)

同じ値を“すべて”削除したい

remove は1件だけなので、繰り返すか、内包表記で“欲しいものだけ残す”のが効率的です。大量件数では内包表記が速くて安全です。

items = ["banana", "apple", "banana", "orange"]
# 1: ループで繰り返す(個数が少ないなら十分)
while "banana" in items:
    items.remove("banana")
print(items)  # ["apple", "orange"]

# 2: 欲しいものだけ残す(大規模データに向く)
items = ["banana", "apple", "banana", "orange"]
items = [x for x in items if x != "banana"]
print(items)  # ["apple", "orange"]
Python

条件で削除(数値や辞書のフィルタ)

remove は値指定のみなので、条件で削除したいときは内包表記や filter を使うのが実務的です。

nums = [10, -5, 30, -2]
nums = [n for n in nums if n >= 0]  # 負の値を除去
print(nums)  # [10, 30]

rows = [
    {"item": "coffee", "price": 350},
    {"item": "tea",    "price": 280},
    {"item": "juice",  "price": 220},
]
rows = [r for r in rows if r["price"] >= 300]  # 価格でフィルタ
print(rows)  # [{'item': 'coffee', 'price': 350}]
Python

ループ中の remove は“位置ずれ”に注意

対象リストを走査しながら remove すると、要素が詰まってインデックスがずれ、見落としが発生します。安全策は「コピーを回す」か「新リストを作る」ことです。

items = ["x", "bad", "y", "bad", "z"]

# 安全:コピーを回す
for v in items[:]:
    if v == "bad":
        items.remove(v)
print(items)  # ["x", "y", "z"]

# さらに安全:新しく作る
items = ["x", "bad", "y", "bad", "z"]
items = [v for v in items if v != "bad"]
print(items)  # ["x", "y", "z"]
Python

実務での使いどころと具体例

入力クレンジング(ノイズ値の除去)

フォームやCSVの“不要な文字列”をピンポイントで取り除きたいときに直感的に使えます。大量や条件付きは内包表記へ。

fields = ["name", "", "email", "phone", ""]
while "" in fields:
    fields.remove("")  # 空文字を除去
print(fields)  # ["name", "email", "phone"]
Python

タグやラベルのメンテナンス

特定タグを外したいときは remove が読みやすいです。存在しない可能性があるなら “in” で事前チェック。

tags = ["news", "tech", "draft"]
if "draft" in tags:
    tags.remove("draft")
print(tags)  # ["news", "tech"]
Python

二次元構造での特定行の削除

行そのもののオブジェクトを指定できるなら remove で簡潔に消せます。条件で消すときはフィルタが適切です。

rows = [
    ["coffee", 350],
    ["tea",    280],
    ["juice",  220],
]
rows.remove(["tea", 280])
print(rows)  # [["coffee", 350], ["juice", 220]]
Python

性能と仕様の理解(検索+シフトのコストを見積もる)

remove は「対象を探す O(n)」→「後ろを詰める O(n)」が起き得ます。1回なら問題になりにくいですが、何千・何万件で大量に繰り返すと効率が落ちます。まとめて除去したいなら“欲しいものだけ残す”方式(内包表記)に切り替えるのが定石です。先頭側・中間での連続削除はシフトが多くなるため、データ量が大きいほどコストを意識しましょう。

また、remove は「値の等価比較」で判定します。数値の 1 と True は等しい(Python では True == 1)ため、意図せず削除されることがあります。型をそろえる、データ設計で混在を避けると安全です。

items = [1, True, 2]
items.remove(1)
print(items)  # [True, 2](True が残るが、True==1 のため注意)
Python

例題で身につける(定番から一歩先まで)

例題1:最初の一致だけ削除して整合性を保つ

queue = ["A", "B", "B", "C"]
queue.remove("B")
print(queue)  # ["A", "B", "C"]
Python

例題2:見つからない場合の安全な削除

def safe_remove(lst, value):
    try:
        lst.remove(value)
        return True
    except ValueError:
        return False

items = ["apple", "orange"]
removed = safe_remove(items, "banana")
print(removed, items)  # False ["apple", "orange"]
Python

例題3:指定値をすべて削除(内包表記版)

def remove_all(lst, value):
    return [x for x in lst if x != value]

print(remove_all(["x", "y", "x", "z"], "x"))  # ["y", "z"]
Python

例題4:条件で一括削除(価格が閾値未満を削除)

rows = [
    {"name": "coffee", "price": 350},
    {"name": "tea",    "price": 280},
    {"name": "juice",  "price": 220},
]
rows = [r for r in rows if r["price"] >= 300]
for r in rows:
    print(r["name"], r["price"])  # coffee 350
Python

まとめ

list.remove は「値で指定して、最初の一致をその場で削除する」メソッドです。戻り値はなく、見つからない値では ValueError。位置で消すなら pop/del、複数・条件で消すなら“欲しいものだけ残す”内包表記が定石です。ループ中の remove は位置ずれに注意し、コピーを回すか新リストを構築するのが安全。検索とシフトのコスト、等価比較の仕様(True と 1 など)を理解して選択すれば、初心者でも読みやすく正確な削除処理を書けます。

タイトルとURLをコピーしました