1. ホーム
  2. python

[解決済み] Pythonのリストから複数の項目を1つのステートメントで削除する

2022-04-26 08:51:45

質問

Pythonで、リストから項目を削除する方法を知っています。

item_list = ['item', 5, 'foo', 3.14, True]
item_list.remove('item')
item_list.remove(5)

この上記のコードは、item_listから値5と'item'を削除しています。 しかし、削除するものがたくさんあるときは、何行も書いて

item_list.remove("something_to_remove")

削除するもののインデックスがわかっている場合は、それを使う。

del item_list[x]

ここで、xは削除したい項目のインデックスです。

削除したい番号のインデックスが全て分かっている場合は、何らかのループを使って del をインデックスで指定します。

しかし、削除したい項目のインデックスがわからない場合はどうすればいいのでしょうか?

試しに item_list.remove('item', 'foo') というエラーが発生しました。 remove は引数を1つしか取らない。

1つのステートメントでリストから複数の項目を削除する方法はありますか?

追伸:私はこれまで delremove . どなたかこの2つの違い、あるいは同じものであることを説明していただけませんか?

ありがとうございます

解決方法は?

Pythonでは、既存のオブジェクトを変更するよりも、新しいオブジェクトを作成する方が良い場合が多いです。

item_list = ['item', 5, 'foo', 3.14, True]
item_list = [e for e in item_list if e not in ('item', 5)]

と等価である。

item_list = ['item', 5, 'foo', 3.14, True]
new_list = []
for e in item_list:
    if e not in ('item', 5):
        new_list.append(e)
item_list = new_list

フィルタリングされた値の大きなリストの場合(ここでは。 ('item', 5) は小さな要素の集合です)。 set の方が速いので in 操作 は平均でO(1)の時間計算量 . また、リスト内包の繰り返しごとにイテラブルを作成するのではなく、削除するイテラブルを先に作成するのも良いアイデアです。

unwanted = {'item', 5}
item_list = [e for e in item_list if e not in unwanted]

A ブルームフィルタ は、メモリが安くない場合は、良い解決策でもあります。