Pythonでリストが別のリストのサブセットかどうかを確認する3つの方法
テキスト分析をはじめとするさまざまなデータ分析の分野では、あるリストがより大きなリストの一部(サブセット)になっているかどうかを判定する必要がよく生じます。本記事では、Pythonでこの要件を実現するための代表的な3つの方法を、具体的なコード例とともに解説します。
方法1:all関数を使う
forループを使って、小さい方のリスト(サブリスト)のすべての要素が、大きい方のリストに存在するかどうかを1つずつ確認します。all()関数は、すべての評価がTrueを返した場合にのみTrueを返すため、サブセット判定にそのまま利用できます。
コード例
Alist = ['Mon','Tue', 5, 'Sat', 9]
Asub_list = ['Tue',5,9]
# 元のリストとサブリスト
print("Given list ",Alist)
print("Given sublist",Asub_list)
# all関数で判定
if (all(x in Alist for x in Asub_list)):
print("Sublist is part of bigger list")
else:
print("Sublist is not part of bigger list")
# 別のサブリストで再度確認
Asub_list = ['Wed',5,9]
print("New sublist",Asub_list)
if (all(x in Alist for x in Asub_list)):
print("Sublist is part of bigger list")
else:
print("Sublist is not part of bigger list")実行結果
上記のコードを実行すると、次の出力が得られます。
Given list ['Mon', 'Tue', 5, 'Sat', 9] Given sublist ['Tue', 5, 9] Sublist is part of bigger list New sublist ['Wed', 5, 9] Sublist is not part of bigger list
方法2:issubsetメソッドを使う
このアプローチでは、両方のリストをset()で集合に変換し、issubset()メソッドを使って、サブリストが元のリストの部分集合であるかどうかを検証します。
コード例
Alist = ['Mon','Tue', 5, 'Sat', 9]
Asub_list = ['Tue',5,9]
# 元のリストとサブリスト
print("Given list ",Alist)
print("Given sublist",Asub_list)
# issubsetで判定
if(set(Asub_list).issubset(set(Alist))):
print("Sublist is part of bigger list")
else:
print("Sublist is not part of bigger list")
# 別のサブリストで再度確認
Asub_list = ['Wed',5,9]
print("New sublist",Asub_list)
if(set(Asub_list).issubset(set(Alist))):
print("Sublist is part of bigger list")
else:
print("Sublist is not part of bigger list")実行結果
上記のコードを実行すると、次の出力が得られます。
Given list ['Mon', 'Tue', 5, 'Sat', 9] Given sublist ['Tue', 5, 9] Sublist is part of bigger list New sublist ['Wed', 5, 9] Sublist is not part of bigger list
方法3:intersectionメソッドを使う
intersection()メソッドは、2つの集合の共通要素を求めます。ここでもリストを集合に変換したうえで積集合を計算し、その結果がサブリストの集合と完全に一致すれば、サブリストは元のリストの一部であると判断できます。
コード例
Alist = ['Mon','Tue', 5, 'Sat', 9]
Asub_list = ['Tue',5,9]
# 元のリストとサブリスト
print("Given list ",Alist)
print("Given sublist",Asub_list)
# intersectionで判定
if(set(Alist).intersection(Asub_list)== set(Asub_list)):
print("Sublist is part of bigger list")
else:
print("Sublist is not part of bigger list")
# 別のサブリストで再度確認
Asub_list = ['Wed',5,9]
print("New sublist",Asub_list)
if(set(Alist).intersection(Asub_list)== set(Asub_list)):
print("Sublist is part of bigger list")
else:
print("Sublist is not part of bigger list")実行結果
上記のコードを実行すると、次の出力が得られます。
Given list ['Mon', 'Tue', 5, 'Sat', 9] Given sublist ['Tue', 5, 9] Sublist is part of bigger list New sublist ['Wed', 5, 9] Sublist is not part of bigger list
まとめ
3つの方法はいずれも同じ結果をもたらしますが、特徴が異なります。all()を使う方法はリストのまま処理できるため、重複要素や順序が意味を持つデータにもそのまま適用できます。一方、issubset()やintersection()を使う方法は集合演算ベースのため高速ですが、変換時に重複が失われ、順序の情報も無視される点に注意が必要です。用途に応じて適切な方法を選択しましょう。
-
【Python】二分木が別の木の部分木(サブツリー)かどうかを判定する方法
はじめにプログラミングにおいて、ある二分木が別の二分木の部分木(サブツリー)であるかどうかを判定する処理は、よく登場する基本的な課題の一つです。この記事では、Pythonを使ってこの問題を効率的に解く方法を、具体的なコード例とともにわかりやすく解説します。問題の概要2つの二分木が与えられたとき、「2つ目の木が1つ目の木の部分木になっているか」を確認します。たとえば、次のような入力があった場合:この場合、root2(値4を根とする木)は root1 の中にそのまま含まれているため、出力は True になります。解法のアプローチこの問題は再帰(recursion)を使うことでシンプルに解けます。判
-
Pythonで文字列が指定したサフィックス(接尾辞)リストのいずれかで終わるかどうかを確認する方法
endswith()メソッドを使う方法 Pythonの文字列クラスには、endswith()メソッドが用意されています。このメソッドは、検索したい文字列のタプルを受け取り、文字列オブジェクトに対して呼び出します。以下のように使用できます。 string = core java print(string.endswith((txt, xml, java, orld))) 実行結果 True タプル内のいずれかのサフィックスで文字列が終わっていればTrueが返され、どれにも該当しなければFalseが返されます。シンプルな判定であれば、この方法が最も可読性が高くおすすめです。 正規表現(re.sea