【Python】for文でリストの要素を削除する方法

python
スポンサーリンク
ピーター
ピーター

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な...

コメント

ランキング

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