
ピーター
for文の中でリストの要素を削除したい場合の書き方を知りたい
考えなしにfor文中で特定要素を削除したら、所望の動作をしませんでした。
と困ったので、調べて解決した実装できたため、その備忘録として今回の内容を共有します。
うまく動かないサンプルコード
リストを順番に消していこうとした場合、以下のコードを実行すると、所望の結果にならないことがあります。
n_list = list(range(5))
# n_list = [0 1 2 3 4]
for n in n_list:
print("remove n:", n, "linst:", n_list)
n_list.remove(n)
### remove n: 0 n_list: [0, 1, 2, 3, 4]
### remove n: 2 n_list: [1, 2, 3, 4]
### remove n: 4 n_list: [1, 3, 4]
最終結果:[1, 3]
シンプルな解決方法(リストコピーを利用する)
for文の中でリストコピーをすることで、リストを順番に消すことができます。
サンプルコード
for n in n_list[:]:
print("n:", n, "n_list:", n_list)
n_list.remove(n)
### remove n: 0 n_list: [0, 1, 2, 3, 4]
### remove n: 1 n_list: [1, 2, 3, 4]
### remove n: 2 n_list: [2, 3, 4]
### remove n: 3 n_list: [3, 4]
### remove n: 4 n_list: [4]
最終結果:[]
リストコピーをしない対応方法(最後の要素を消す)
for文の中でリストコピーをする場合、どうしても処理に時間がかかってしまいます。
そのため、最後の要素から順番に消していくことでコピーする時間を省略化できます
サンプルコード
最後の要素を消すため、removeではなくpopもしくはdelを使用してください。
n_list = list(range(5))
n_list = [n*2 for n in n_list]
print(n_list)
for n in reversed(range(len(n_list))):
print("n:", n, "n_list:", n_list)
n_list.pop(n) ### del n_list[n]でもOK
### 初期値:[0, 2, 4, 6, 8]
### remove n: 4 n_list: [0, 2, 4, 6, 8]
### remove n: 3 n_list: [0, 2, 4, 6]
### remove n: 2 n_list: [0, 2, 4]
### remove n: 1 n_list: [0, 2]
### remove n: 0 n_list: [0]
最終結果:[]
removeではダメなの?
Removeの注意点は、「最初に見つけた指定する要素を削除」する点です。
同じ要素がリスト内にある場合、先頭から削除されるため、for文で処理したい内容と動作が異なるため、所望の動きをしなくなってしまいます。
そのため、popもしくはdelで特定の要素を削除するようにしたいですね!
参考ページ
今回の考え方について参考にしたページ

【Python】リストの要素を削除するforループの書き方【一般的な方法と高速な方法】
Pythonのリスト(list)から『条件を指定して要素を削除』するためには、リストをfor文にかける必要がありました。そのコード例と速さの比較を紹介します。for文で問題になったのが、インデックスエラー(IndexError:listas
リストの仕様を調べたページ(Pythonドキュメント)

5. データ構造
この章では、すでに学んだことについてより詳しく説明するとともに、いくつか新しいことを追加します。リスト型についてもう少し:リストデータ型には、他にもいくつかメソッドがあります。リストオブジェクトのすべてのメソッドを以下に示します:以下にリストのメソッドをほぼ全て使った例を示します:insert,remove,sortな...
コメント