Pythonで複数の文字列のいずれかが別の文字列に含まれているか判定する方法
Pythonでは、リスト内の複数の文字列のうち、どれか1つでも別の文字列に含まれているかどうかを調べたい場面がよくあります。そんなときに便利なのが、組み込み関数 any() を使った方法です。
any() 関数を使う基本的な方法
any() は、引数に渡したイテラブルの中に真と評価される要素が1つでもあれば True を返します。ジェネレータ式と組み合わせることで、各文字列が対象の文字列に含まれているかを簡潔に判定できます。
例
arr = ['a', 'e', 'i', 'o', 'u']
text = "hello people"
if any(c in text for c in arr):
print("マッチが見つかりました")
出力
実行すると次のような結果が得られます。
マッチが見つかりました
このコードでは、「hello people」という文字列の中に、母音(a, e, i, o, u)のいずれかが含まれているかをチェックしています。「e」や「o」などが含まれているため条件は True となり、メッセージが出力されます。
正規表現を使う方法
やや大げさな方法ですが、正規表現を使って配列の要素をまとめてマッチさせることもできます。リストの要素を |(OR)で連結してパターンを作成し、re.findall() で検索します。
例
import re
arr = ['a', 'e', 'i', 'o', 'u']
text = "hello people"
if any(re.findall('|'.join(arr), text)):
print('マッチが見つかりました')
出力
実行すると次のような結果が得られます。
マッチが見つかりました
'|'.join(arr) によって a|e|i|o|u というパターンが生成され、対象の文字列中にこれらのいずれかに一致する部分があれば、findall() が結果のリストを返します。そのリストが空でなければ any() が True を返す仕組みです。
まとめ
単純な存在チェックには any(c in text for c in arr) の形式が最もシンプルで読みやすくおすすめです。正規表現を使う方法は、より柔軟なパターンマッチングを行いたい場合に有効ですが、単純な判定にはオーバースペックといえます。用途に応じて使い分けるとよいでしょう。
-
Pythonで文字列sを別の文字列tに変換できるか判定する方法
2つの文字列 s と t が与えられ、t はすべて大文字であるとします。次の操作を繰り返すことで、s を t に変換できるかどうかを判定する問題を考えてみましょう。一部の小文字を大文字に変換する。すべての小文字を削除する。たとえば、入力が s = fanToM、t = TOM の場合、出力は True になります。o を O に変換し、残りの小文字をすべて削除すれば t と一致するためです。解法のアプローチこの問題は動的計画法(DP)を使って効率的に解けます。dp[i][j] を「s の先頭 i 文字を使って、t の先頭 j 文字を作れるかどうか」を表す真偽値として定義します。具体的な手順は以
-
PythonでDFAを使って2進数文字列が3の倍数かどうかを判定する方法
はじめに ある数の2進表現を配列 n として受け取り、その値が3で割り切れるかどうかを「決定性有限オートマトン(DFA)」を使って判定する問題を考えてみましょう。 例えば、入力が n = [1, 1, 0, 0](10進数の12に相当)であれば、12は3の倍数なので出力は True になります。 DFAによるアプローチ この問題は、次のようなDFAを構築することで解けます。 考え方はシンプルです。ある数が3で割り切れるとき余りは0になり、割り切れない場合は余りが1または2になります。そこで、これら3つの余り(0・1・2)に対応する3つの状態を用意します。初期状態は余り0を表すため、同時に受理