Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonでリストから指定したインデックスの複数要素を削除する方法

Pythonのリストから単一の要素を削除するのは、del文とインデックスを組み合わせれば簡単に行えます。しかし、複数のインデックスに該当する要素をまとめて削除したいケースでは、少し工夫が必要です。本記事では、削除対象となるインデックスのリストを指定して、元のリストから該当する要素だけを取り除く方法を2つ紹介します。

方法1:sorted()とdelを組み合わせる

このアプローチでは、まず削除したい位置(インデックス)を格納したリストを作成します。その後、降順にソートしてから後ろの要素から順に削除することで、削除処理中にインデックスがずれる問題を回避し、元のリストの構造を保ったまま安全に要素を削除できます。最後に、del文を使って元のリストから該当するインデックスの要素を削除します。

サンプルコード

Alist = [11, 6, 8, 3, 2]

# 削除対象のインデックスリスト
idx_list = [1, 3, 0]

# 元のリストを表示
print("Given list is : ", Alist)

# インデックスリストを表示
print("The indices list is : ", idx_list)

# 降順ソートしてdelで削除
for i in sorted(idx_list, reverse=True):
    del Alist[i]

# 結果を表示
print("List after deleted elements : ", Alist)

実行結果

上記のコードを実行すると、以下の出力が得られます。

Given list is : [11, 6, 8, 3, 2]
The indices list is : [1, 3, 0]
List after deleted elements : [8, 2]

idx_listは降順ソートにより [3, 1, 0] の順で処理されるため、大きなインデックスから先に削除されます。これにより、削除のたびにリストが縮んでも、まだ処理していない小さいインデックスの位置がずれることはありません。結果として、インデックス0・1・3にある要素だけが正しく削除され、[8, 2] が出力されます。

方法2:enumerate()とnot inを使う

もうひとつの方法として、enumerate()関数と内包表記の中で not in を使う手法があります。各要素とともにインデックスを取得し、そのインデックスが削除対象リストに含まれていない場合のみ新しいリストに残すことで、同じ結果を得られます。スライス代入 Alist[:] を使うことで、元のリストオブジェクト自体を書き換えている点もポイントです。

サンプルコード

Alist = [11, 6, 8, 3, 2]

# 削除対象のインデックスリスト
idx_list = [1, 3, 0]

# 元のリストを表示
print("Given list is : ", Alist)

# インデックスリストを表示
print("The indices list is : ", idx_list)

# スライス代入とnot inで除外
Alist[:] = [ j for i, j in enumerate(Alist)
             if i not in idx_list ]

# 結果を表示
print("List after deleted elements : ", Alist)

実行結果

上記のコードを実行すると、以下の出力が得られます。

Given list is : [11, 6, 8, 3, 2]
The indices list is : [1, 3, 0]
List after deleted elements : [8, 2]

まとめ

どちらの方法も、指定した複数のインデックスに対応する要素を一度に削除できる便利なテクニックです。sorted(reverse=True)delの組み合わせはシンプルで直感的であり、一方、enumerate()と内包表記を使う方法はPythonらしい宣言的なスタイルで記述できます。用途やコードの可読性に応じて使い分けるとよいでしょう。

  1. Pythonでリストの交互範囲スライスを行う方法|range()・enumerate()の活用

    スライシングは、Pythonでリストのデータを分析する際に非常によく使われる基本的な手法です。しかし、分析の目的によっては、特定の範囲の値に基づいてリストを部分的に切り出す必要があります。たとえば、「4つの要素をスキップし、その次の4つの要素を取り出す」という処理を繰り返したい場合などが挙げられます。本記事では、Pythonでこのような交互範囲スライス(alternate range slicing)を実現する方法を、2つのアプローチで解説します。 方法1:range()とlen()を組み合わせる まず、forループでリスト全体の長さ分だけインデックスを走査し、割り算の判定条件を満たす要素だ

  2. 【初心者向け】Pythonでリストのサイズ(要素数)を取得する方法

    リスト(list)は、Pythonにおける代表的なコレクション型のデータ構造の一つです。リストの要素は後から変更でき、重複した値を持つこともできます。本記事では、Pythonでリストのサイズ(長さ)を取得する方法を解説します。具体的には、重複の有無にかかわらず、リストに含まれる全要素の数をカウントする方法を紹介します。リストの長さを取得する基本:len()関数Pythonでリストの要素数を取得するには、組み込み関数の len() を使用します。len() はリストだけでなく、タプル・文字列・辞書などさまざまなコレクションに対しても利用できる汎用的な関数です。サンプルコード以下の例では、「day