やあ、シミヅです!
最近、僕の会社では新しいレコメンドエンジンの開発が佳境に入っていて、毎日膨大なログデータをPythonでこねくり回しています(笑)。
データを扱っていると、「この特定の条件に合うデータだけリストから消したいんだよなっ!」っていう場面が、もう1日に100回くらいあるんですよ!
Pythonで「配列(リスト)から要素を削除する」方法はいくつかあるんですけど、適当に選んじゃうと「あれっ?インデックスがズレて変なデータが消えたんだけどっ!」みたいなバグに繋がっちゃうこともあるんです。
というわけで今回は、初心者の方から実務でバリバリ書きたい人まで役立つ、Pythonのリスト削除メソッドの使い分けを僕と一緒にマスターしていきましょうっ!
執筆者:シミヅ |
|
インデックス(番号)で指定して削除するなら「pop」と「del」
まずは、「リストの何番目を消したい!」とはっきり決まっている時に使う方法です。
これには pop() と del 文の2つがあるんですけど、この使い分けがエンジニアとしての「センス」の見せ所なんですよっ!
以下のコードで、それぞれの違いを確認してみましょう!
# AIの学習用データリスト(適当です笑)
data = ["PyTorch", "TensorFlow", "Keras", "Scikit-learn"]
1. pop() を使った削除(削除した値を受け取れる!)
removed_item = data.pop(1)
print(f"popで消したのはこれっ:{removed_item}")
print(f"今のリスト:{data}")
2. del を使った削除(ただ消すだけ!スライスもいける!)
del data[0]
print(f"delで0番目を消したよ:{data}")
このコードのポイントを僕が解説しますね。
まず、pop() です。
これの凄いところは、「削除した要素をそのまま変数として受け取れる」ところなんです!
「リストから1つ取り出して、そのまま別の処理に使いたい」っていう時にめちゃくちゃ便利です。
もし引数を空にすれば、リストの一番後ろを消してくれます。
次に、del です。
これはキーワード(文)なので、pop よりも動作がちょっと速いのが特徴です。
あと、del data[1:3] みたいに「範囲指定(スライス)」で一気に消せるのも del だけの特権なんですよ。
大量のデータを一気に整理したい時は del の出番ですね!
値(中身)を指定して削除するなら「remove」
「何番目かは知らないけど、『バグ』っていう文字列が入ってたら消したいっ!」
そんな時は、インデックスではなく「値そのもの」を探して消してくれる remove() を使いましょう!
languages = ["Python", "Java", "Ruby", "Python", "C++"]
"Java" を見つけて削除するっ!
languages.remove("Java")
print(f"Javaを消したよ:{languages}")
注意点!最初に見つけた1つだけが消える
languages.remove("Python")
print(f"Pythonを1つ消したよ:{languages}")
このコード、実行してみるとあることに気づきませんか?
そう、remove() は「リストの中に同じ値が複数あっても、最初に見つけた1つしか消さない」んです!
もし "Python" を全部消したいと思ったら、ループを回すか、あとで紹介する「内包表記」を使う必要があります。
あ、それともう一つ大事な注意点がっ!
リストに存在しない値を消そうとすると ValueError でプログラムが止まっちゃいます。
なので、実務では if "Java" in languages: みたいに、存在チェックをしてから消すのが「シミヅ流」の安全な書き方なんですよっ!
条件に合う要素を一気に削除!「リスト内包表記」が最強
僕が実務で一番使っているのがこれです!
「0以下の数値を全部消したい」とか「特定の文字を含む要素だけ除外したい」といった複雑な条件の時は、削除を考えるより「必要なものだけ残した新しいリストを作る」方が圧倒的にスマートなんですよ。
# AIモデルの精度(スコア)リスト
scores = [0.92, 0.45, 0.88, 0.32, 0.95]
0.5以上の高いスコアだけを残す(=低いものを削除!)
high_scores = [s for s in scores if s >= 0.5]
print(f"精度の低いデータを整理したよっ:{high_scores}")
この書き方、初めて見ると「っ?」ってなるかもしれませんが、慣れると手放せなくなります(笑)。
[要素 for 要素 in リスト if 条件] という書き方で、「もし条件に合えば、新しいリストに含める」という動きをします。
これなら、さっきの remove で苦労した「同じ値を全部消す」のも一瞬ですし、元のリストを壊さずに新しいデータを作れるから、デバッグもすごく楽になるんですよっ!
AIエンジニアの現場では、データのクレンジング(お掃除)にこの内包表記を使いまくっています。
まさに必須スキルですね!
全要素を一気に消し去るなら「clear」
たまに、「このリスト、一回リセットして空っぽにしたいっ!」という時がありますよね。
そのために data = [] と書く人も多いですが、実は clear() を使うのがプロの現場では推奨されることが多いんです。
temporary_list = ["temp1", "temp2", "temp3"]
リストを空にする!
temporary_list.clear()
print(f"中身をリセットしたよ:{temporary_list}")
「わざわざ clear() を使う必要あるの?」って思うかもしれません。
実は、data = [] は「新しい空の箱を作る」操作なのに対して、clear() は「今ある箱の中身だけを捨てる」操作なんです。
もし、そのリストを他の場所からも参照していた場合、data = [] だと参照が切れてバグの温床になることがあるんですよ……。
「今の箱を使い回すっ!」という意思表示になる clear() 、ぜひ覚えておいてくださいねっ!
まとめ!状況に合わせた「削除」を選ぼう!
Pythonのリスト削除、色々あって面白いですよねっ。
最後に、僕がいつも意識している使い分けをまとめておきます!
- 削除した値を使いたいなら:
pop() - 特定の場所をパッと消す、または範囲で消すなら:
del - 値を指定して最初に見つけた1つを消すなら:
remove() - 条件で一括削除したいなら(超おすすめ!):リスト内包表記
- とにかく空っぽにリセットするなら:
clear()
エンジニアの世界は「正解が1つじゃない」から面白いんですよね!
あなたのコードが少しでもスッキリして、バグが減るきっかけになれば嬉しいですっ。
以上、シミヅでしたっ!またねっ!



コメント