はじめに
この実験では、Python で文字列が回文 (palindrome) かどうかをチェックする方法を学びます。回文とは、「madam」や「racecar」のように、前から読んでも後ろから読んでも同じになる文字の並びのことです。
この実験では、回文を識別する is_palindrome 関数を定義する Python スクリプトを作成する手順を案内します。これには、入力テキストを小文字に変換し、空白を削除してから、処理されたテキストをその逆順のバージョンと比較することが含まれます。また、サンプルの単語を使って関数をテストする方法も学びます。
回文 (Palindrome) を定義する
このステップでは、回文 (palindrome) の概念と、Python を使って回文を識別する方法を探ります。回文とは、単語、フレーズ、数字、またはその他の文字の並びで、前から読んでも後ろから読んでも同じになるものです。例としては、「madam」、「racecar」、「level」などがあります。
まずは、回文が何であるかを定義する Python スクリプトを作成しましょう。
LabEx 環境で VS Code エディタを開きます。
~/projectディレクトリにpalindrome.pyという名前の新しいファイルを作成します。新しいファイルは、エクスプローラーパネル (通常は左側) を右クリックして「New File」を選択することで作成できます。ファイルを
~/projectディレクトリにpalindrome.pyとして保存することを確認してください。palindrome.pyファイルに以下の Python コードを追加します。def is_palindrome(text): processed_text = ''.join(text.lower().split()) return processed_text == processed_text[::-1] ## Example usage word = "madam" if is_palindrome(word): print(f"'{word}' is a palindrome") else: print(f"'{word}' is not a palindrome")このコードを分解してみましょう。
def is_palindrome(text):: この行は、文字列textを入力とするis_palindromeという名前の関数を定義しています。processed_text = ''.join(text.lower().split()): この行は、入力テキストを回文チェック用に準備します。まず.lower()を使ってテキストを小文字に変換し、次に.split()を使って文字列を単語のリストに分割し、''.join()を使って単語を空白なしで 1 つの文字列に結合します。return processed_text == processed_text[::-1]: この行は、処理されたテキストをその逆順と比較します。processed_text[::-1]は文字列の逆順コピーを作成します。処理されたテキストがその逆順と同じであれば、関数はTrue(回文である) を返し、そうでなければFalseを返します。- 関数定義の後の行は使用例です。「madam」という単語で
is_palindrome関数を呼び出し、それが回文かどうかを出力します。
次に、スクリプトを実行しましょう。WebIDE でターミナルを開きます。通常は VS Code インターフェイスの下部にターミナルタブがありますが、メニューから「Terminal」 -> 「New Terminal」で新しいターミナルを開くこともできます。
ターミナルで、
~/projectディレクトリに移動します (すでにそこにいない場合)。cd ~/projectPython スクリプトを実行します。
python palindrome.py以下の出力が表示されるはずです。
'madam' is a palindromeこれにより、私たちのスクリプトが「madam」を正しく回文として識別できていることが確認できます。
逆順にして比較する
このステップでは、入力文字列を明示的に逆順にしてから元の文字列と比較することで、is_palindrome 関数の動作原理をより深く掘り下げます。これにより、回文 (palindrome) の識別プロセスをより明確に理解することができます。
VS Code エディタで
palindrome.pyファイルを開きます。これは前のステップで作成したファイルと同じです。palindrome.pyのis_palindrome関数を修正して、文字列を明示的に逆順にします。def is_palindrome(text): processed_text = ''.join(text.lower().split()) reversed_text = processed_text[::-1] ## Explicitly reverse the string return processed_text == reversed_text ## Example usage word = "madam" if is_palindrome(word): print(f"'{word}' is a palindrome") else: print(f"'{word}' is not a palindrome") word2 = "hello" if is_palindrome(word2): print(f"'{word2}' is a palindrome") else: print(f"'{word2}' is not a palindrome")変更点は以下の通りです。
reversed_text = processed_text[::-1]: この行はprocessed_text文字列を逆順にしたコピーを作成し、reversed_text変数に代入します。return processed_text == reversed_text: この行では、元の処理済みのテキストと明示的に逆順にしたテキストを比較します。- 回文ではないことを示すために、「hello」という単語を使った 2 つ目の例を追加しました。
palindrome.pyの変更を保存します。ターミナルでスクリプトを再度実行します。
python palindrome.py以下の出力が表示されるはずです。
'madam' is a palindrome 'hello' is not a palindromeこの出力により、スクリプトが回文と非回文の両方を正しく識別できていることが確認できます。文字列を明示的に逆順にすることで、
is_palindrome関数のロジックがより明確になりました。
大文字小文字と空白を無視する
このステップでは、is_palindrome 関数を拡張して、空白や大文字小文字が混在する回文 (palindrome) のフレーズを扱えるようにします。たとえば、「A man, a plan, a canal: Panama」は、空白、句読点、大文字小文字を無視すれば回文になります。
VS Code エディタで
palindrome.pyファイルを開きます。palindrome.pyのis_palindrome関数を修正して、大文字小文字と空白を無視するようにします。import re def is_palindrome(text): processed_text = re.sub(r'[^a-zA-Z]', '', text).lower() reversed_text = processed_text[::-1] return processed_text == reversed_text ## Example usage word1 = "A man, a plan, a canal: Panama" if is_palindrome(word1): print(f"'{word1}' is a palindrome") else: print(f"'{word1}' is not a palindrome") word2 = "Racecar" if is_palindrome(word2): print(f"'{word2}' is a palindrome") else: print(f"'{word2}' is not a palindrome") word3 = "hello" if is_palindrome(word3): print(f"'{word3}' is a palindrome") else: print(f"'{word3}' is not a palindrome")変更点を分解してみましょう。
import re: この行は、正規表現操作を提供するreモジュールをインポートします。processed_text = re.sub(r'[^a-zA-Z]', '', text).lower(): この行では、正規表現を使って入力テキストから文字 (a - z、A - Z) 以外のすべての文字を削除します。re.sub(r'[^a-zA-Z]', '', text)は、すべての非文字文字を空文字列に置き換えることで、実質的に削除します。その後、.lower()で結果の文字列を小文字に変換します。- 「A man, a plan, a canal: Panama」、「Racecar」、「hello」を使った使用例を追加して、更新された関数をテストします。
palindrome.pyの変更を保存します。ターミナルでスクリプトを再度実行します。
python palindrome.py以下の出力が表示されるはずです。
'A man, a plan, a canal: Panama' is a palindrome 'Racecar' is a palindrome 'hello' is not a palindromeこの出力により、スクリプトが空白、句読点、大文字小文字が混在する場合でも回文を正しく識別できることが確認できます。正規表現によって入力テキストが効果的にクリーニングされ、正確な回文検出が可能になります。
まとめ
この実験 (Lab) では、まず、前後を逆にしても同じに読める文字列である回文 (palindrome) の概念を探索しました。次に、回文を識別するための is_palindrome(text) 関数を含む palindrome.py という名前の Python スクリプトを作成しました。
is_palindrome 関数は、まず入力テキストを小文字に変換し、空白を削除することで前処理を行います。その後、処理されたテキストを逆順にしたバージョンと比較して、回文かどうかを判断します。回文であれば True を返し、そうでなければ False を返します。スクリプトには、関数を呼び出して結果を出力する方法を示す使用例も含まれています。



