Python逆引き:クラスオブジェクトのリストから特定の要素を含んだものだけ取得したい

備忘録ヘッダ画像 逆引きソースコード

自作したあるクラスのリストがあるとして、そのリストの中から特定の要素を含んだものだけ抽出したいときの例。

基本形:文字列リストから特定文字列を含んだ要素を取得する場合

まずは基本形として、文字列リストから特定文字列を含む要素を取得する例を記載しておく。
この場合はリスト内包表記を使用するのが良く見るパターン。
以下は、特定の文字列”りんご”を含む要素だけを抽出する例。

original_list = ["りんご", "バナナ", "りんごジュース", "オレンジ", "リンゴ"]

# "特定の文字列" を含む要素だけを抽出
filtered_list = [item for item in original_list if "りんご" in item]

print(filtered_list)
実行結果
['りんご', 'りんごジュース']

この例では、original_listから ひらがなの”りんご” を含む要素だけが filtered_listに抽出される。

クラスオブジェクトのリストから、特定の要素を含んだものだけ取得する

クラスオブジェクトのリストから特定の要素(プロパティ)を持つオブジェクトを抽出するには、基本形同様にリスト内包表記を使用できる。
以下は、特定のプロパティ(例: “target_property“)を持つオブジェクトだけを抽出する例。

class MyClass:
    def __init__(self, name, target_property):
        self.name = name
        self.target_property = target_property # 取得条件に使う要素

# クラスオブジェクトのリストを作成
objects_list = [MyClass("obj1", "target_value1"),
                MyClass("obj2", "target_value2"),
                MyClass("obj3", "target_value1"),
                MyClass("obj4", "target_value3")]

# "target_value1" を持つオブジェクトだけを抽出
filtered_objects = [obj for obj in objects_list if obj.target_property == "target_value1"]

for obj in filtered_objects:
    print(f"Name: {obj.name}, Target Property: {obj.target_property}")
実行結果
Name: obj1, Target Property: target_value1
Name: obj3, Target Property: target_value1

この例では、objects_listから target_property"target_value1"のオブジェクトだけが filtered_objectsに抽出される。
実際のクラスやプロパティに合わせて適切な条件を指定すること。

リスト内包表記じゃないとダメなのか?

そんなことは無いが、リスト内包表記はコードを簡潔に一行で表現できるため、可読性が向上する。
またリスト内包表記は通常、リストを構築するための効率的な方法でもある。
一方でfor文を使用して同じ結果を得ることもできるが、リスト内包表記の方が一般的にシンプルでコンパクトになる。

for文を使った場合とのコード比較
# for文を使った場合
filtered_objects_for = []
for obj in objects_list:
    if obj.target_property == "target_value1":
        filtered_objects_for.append(obj)

# リスト内包表記を使った場合
filtered_objects = [obj for obj in objects_list if obj.target_property == "target_value1"]

リスト内包表記の方が簡潔であり、同じ処理を行っていることが一目でわかる。たいていの職場では、簡潔かつ可読性の高いコードが好まれるだろう。
ただ可読性が損なわれる場合や処理が複雑になる場合は、for文を使った方が良い場面も多々あると思う。使い分けに関しては、いろんなコードに触れてセンスを磨くのが一番な気がする。

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