芋の独り言

当ブログへのアクセスは当ブログのプライバシーポリシーに同意したものとみなします.

リストの要素一括削除はできないが,それっぽいことはできる.

リストの要素指定するものだけを一斉に削除したい... でないとインデックス番号が変わっちゃうので上手く削除できない. 方法をググると,

  1. Pythonでリストから複数の要素を取り除く方法 | ガンマソフト株式会社
  2. pythonリストの複数要素削除 - Qiita

どちらも疑似的に一括削除. といいますか,一括削除できるメソッドがPythonにないんですね... 他の言語にあるのかどうかは知らないですが...

元々のリストを変更したい場合は前者の方法で, リストを新規作成になっても内包表記で一行でコンパクトにしたい方法が後者という感じ.

ただ,上記のを見ていたら別の方法っぽいのを思い浮かんだので以下にメモ.

>>> a=[1,2,3,4,5]
>>> indexes = [0,2,4]
>>> [a[i]=None for i in indexes]
  File "<interactive input>", line 1
    [a[i]=None for i in indexes]
         ^
SyntaxError: invalid syntax
>>> for i in indexes:
...     a[i] = None
...     
>>> a
[None, 2, None, 4, None]
>>> while True:
...     try:
...         a.remove(None)
...     except ValueError:
...         break
...     
>>> a
[2, 4]

変更したい部分の要素の値をNoneにし,その後でNoneとした要素を削除するという方法です. が,参考にしたものよりも記述が長くなってしまいました... あと,この方法だと元々Noneを含むリストだと全要素を削除することになり, リストの要素のデータ型によってNoneでないものに書き換える必要があり, スマートなやり方ではないですね...

途中for文を一行で収めたいと思ってリスト内砲表記使いましたが, 内砲表記内で既存のリストへの値の代入はできなかった... なので通常のfor文を使用したので2行に... ただ,[Python] for文処理が1行で書ける!素敵なリスト内包表記 - YoheiM .NETによると内包表記は実行速度が速いようなので, うまく使えればなぁ...