Pythonでリスト内インスタンスを検索・削除する方法

8476 ワード

経緯

インスタンスが入った配列に対して、任意のインスタンスを検索したくなった時の備忘録として。
もっと効率のよいやり方をご存じの方はご教示ください。

概要

index検索からの削除

  1. 対象のlistからfilterで削除したいインスタンスを抽出
  2. list.index("対象のインスタンス")でindexを検索
  3. list.pop(index)で削除完了
# 適当なクラス
class Person:
    def __init__(self,name,id) -> None:
        self.name = name
        self.id = id
    
    def __repr__(self) -> str:
        return self.name

# Personを入れる配列peopleを定義
people = []

# peopleへ適当なPersonオブジェクトを代入
people.append(Person('taro',1))
people.append(Person('jiro',2))
people.append(Person('hana',3))

print(people)
# [taro, jiro, hana]

# jiroを検索
jiro = list(filter(lambda x:x.id==2,people))[0]
jiro_idx = people.index(jiro)
# peopleからjiroを削除(インデックス指定)
people.pop(jiro_idx)

print(people)
# [taro,hana]

インスタンス指定での削除

  1. 対象のlistからfilterで削除したいインスタンスを抽出
  2. list.remove("対象のインスタンス")で削除完了
# 適当なクラス
class Person:
    def __init__(self,name,id) -> None:
        self.name = name
        self.id = id
    
    def __repr__(self) -> str:
        return self.name

# Personを入れる配列peopleを定義
people = []

# peopleへ適当なPersonオブジェクトを代入
people.append(Person('taro',1))
people.append(Person('jiro',2))
people.append(Person('hana',3))

print(people)
# [taro, jiro, hana]

# taroを検索
taro = list(filter(lambda x:x.name=='taro',people))[0]
# peopleからtaroを削除(インスタンス指定)
people.remove(taro)

print(people)
# [jiro, hana]