文字列操作に関するPythonプログラム

公開: 2022-04-26

このチュートリアルでは、文字列操作に関するよくある質問を解決するPythonプログラムを作成します。

Python文字列が回文アナグラムであり、タイトルケースに含まれているかどうかを確認する方法を学習します。

Python文字列:クイックレビュー

Pythonでは、文字列は強力な組み込みデータ型です。 一連の文字を格納できます。

Python文字列でのインデックス付け:すべてのPython反復可能オブジェクトと同様に、文字列もゼロインデックス付けされます。 したがって、長さNの文字列の有効なインデックスは、0、1、2からN –1までです。

python-strings

Pythonは、文字列の末尾から要素にアクセスするための負のインデックスもサポートしています。 したがって、-1は文字列の最後の文字のインデックス、-2は文字列の最後から2番目の文字のインデックスというように続きます。

Python文字列の不変性:さらに、Pythonの文字列は不変であるため、その場で変更することはできません。 ただし、それらに対していくつかの文字列メソッドを呼び出して、文字列のコピーを取得し、目的の結果を得ることができます。

Python文字列の基本を確認したので、次に、いくつかの単純で興味深い問題の解決に進みましょう。

はじめましょう。

Python文字列が回文であるかどうかを確認します

問題:Python文字列が与えられたら、それが回文であるかどうかを確認します。

はいの場合、Trueを返します。 それ以外の場合は、Falseを返します。

したがって、最初の問題は、特定の文字列が回文であるかどうかを確認することです。

回文は、左から右、および右から左に同​​じものを読み取る文字列です。 いくつかの例をリストアップしましょう:レースカー、参照、レベル、マダム、レーダーなど。

python-string-palindrome

この問題を解決する手順は次のとおりです。

  • 文字列の逆コピーを取得し、必要に応じて別の変数に格納します。
  • 元の文字列と反転した文字列の値を比較します。
  • それらが等しい場合、文字列は回文です。 したがって、 Trueを返し、停止します。
  • 元のコピーと反転したコピーが等しくない場合、文字列は回文ではありません。 したがって、 Falseを返す必要があります。

重要な操作は、文字列の逆コピーを取得することです。 Pythonでは、これを行うためのいくつかの異なる方法があります。

ただし、2つのアプローチについて説明します。

  • 文字列スライスを使用する
  • reverse()関数とjoin()メソッドを使用する

スライスを使用してPython文字列を反転する方法

構文<any_str>[start: stop: step]は、文字列<any_str>のスライスを、 startからstopまで、ステップサイズstepで返します。

  • startを省略すると、スライスは文字列の先頭から始まります。
  • stopインデックスを指定しない場合、スライスは文字列の最後まで拡張されます。
  • また、 stepの負の値を使用して、文字列の末尾から始まるスライスを返すことができます。

したがって、 <any_str>[::-1]は、文字列の逆コピーを返します。

次のコードセルには、関数is_palindrome()の定義が含まれています。

引数として文字列を取り、回文かどうかに応じてTrueまたはFalseを返します。

ここでは、文字列の逆コピーを取得するために文字列のスライスを使用しました。

 def is_palindrome(this_str): rev_str = this_str[::-1] if (this_str == rev_str): return True else: return False

️関数を定義したので、先に進んで、引数として任意の有効な文字列を使用して呼び出すことができます。

 is_palindrome("racecar") True

上記のコードセルでは、 racecarは回文です。 したがって、関数is_palindrome()は期待どおりにTrueを返します。

ここで、 riverなど、回文ではない任意の文字列を使用して関数を呼び出してみてください。

 is_palindrome("river") False

ご覧のとおり、 Falseを返します。これは正しいです。

reverse()とjoin()を使用してPython文字列を逆にする方法

Pythonでは、 join()メソッドをreversed()関数と一緒に使用して、文字列を逆にすることができます。

  • reverse reversed()関数は、文字列内の文字を介して逆イテレータを返します。
  • 次に、 join()メソッドを使用して、これらの文字を逆の順序で結合できます。

上記のメソッドを使用すると、以下のコードセルのようにis_palindrome()関数を書き直すことができます。

 def is_palindrome(this_str): rev_str = ''.join(reversed(this_str)) if (this_str == rev_str): return True else: return False

リスト内包内のis_palindrome()関数を使用して、より長い文字列リストからすべての回文を収集することもできます。

 str_list = ["refer","blue","level","12321","dragon"] palindromes = [string for string in str_list if is_palindrome(string)] print(palindromes) # Output ['refer', 'level', '12321']

上記のコードの仕組みは次のとおりです。

  • str_listをトラバースし、各文字列でis_palindrome()を呼び出します。
  • is_palindrome()Trueを返す場合は、文字列をpalindromesリストに追加します。

上記の出力でわかるように、 palindromesstr_list内のすべてのパリンドローム文字列のリストです。

2つのPython文字列がアナグラムであるかどうかを確認します

インタビューで出くわす可能性のあるもう1つのよくある質問は、文字列str1str2のペアがアナグラムであるかどうかを確認することです。

2つの文字列の文字数がまったく同じである場合、2つの文字列はアナグラムと呼ばれます。 これは、他の文字列の文字を並べ替えたり並べ替えたりすることで、一方の文字列を取得できることを意味します。

アナグラムの例には、state-taste、save-vase、elbow-belowなどがあります。

python-strings-anagrams

Pythonでカウンターオブジェクトを使用してアナグラムをチェックする方法

簡単で直感的な方法は、2つの文字列の各文字の出現回数を計算することです。 次に、カウントが等しいかどうかを確認します。

これは、 itertoolsモジュールのCounterオブジェクトを使用してさらに簡単に実行できます。 Counterオブジェクトは、Pythonディクショナリを返します。文字をキーとして、対応するカウントをとして使用します。

以下に示すように、文字列"save""vase"について考えてみます。

 str1 = "save" str2 = "vase"

ここで、 c1c2は、それぞれ文字列str1str2の文字数を含むカウンターオブジェクトです。

 from collections import Counter c1 = Counter(str1) c2 = Counter(str2) print(c1) print(c2) c1 == c2 # Output Counter({'s': 1, 'a': 1, 'v': 1, 'e': 1}) Counter({'v': 1, 'a': 1, 's': 1, 'e': 1}) True

c1 == c2は、 str1str2がアナグラムであるため、 Trueを返します。

このロジックを使用して、先に進み、2つのパラメーターword1word2を使用して関数are_anagrams()を定義できます。 関数本体で、 Counter(word1) == Counter(word2)かどうかを確認します。

 def are_anagrams(word1, word2): if Counter(word1) == Counter(word2): return True else: return False

️確認するには、 str1str2を引数としてare_anagrams()を呼び出します。 str1str2はアナグラム(「保存」と「花瓶」)であるため、関数はTrueを返します。これは正しいです。

 are_anagrams(str1, str2) True

文字列のソートされたコピーを使用してアナグラムをチェックする方法

これを行う別の方法があります。

2つの文字列がアナグラムの場合、それらのソートされたコピーは等しくなります。

したがって、関数are_anagrams()を書き直して、 str1のソートされたバージョンがstr2のソートされたコピーと同じであるかどうかを確認できます。 それらが等しい場合、2つの文字列はアナグラムです。 そうでなければ、そうではありません。

上記のメソッドを使用して、ソートされたコピーの同等性をチェックすると、関数are_anagrams()を次のように書き直すことができます。

 def are_anagrams(word1, word2): if sorted(word1) == sorted(word2): return True else: return False

ここで、いくつかの関数呼び出しを行います。

  • 文字列「elbow」と「below」はアナグラムであり、関数are_anagrams()Trueを返します。
  • また、「state」と「tasted」はアナグラムではなく、関数はFalseを返します。
 are_anagrams("below","elbow") True are_anagrams("state","tasted") False

Python文字列がタイトルケースに入っているかどうかを確認します

これがこのチュートリアルの最後の質問です。

問題:文字列が与えられた場合:人の名前-名と姓。

姓と名の両方の最初の文字が大文字になっているかどうかを確認する必要があります。

各単語の最初の文字が大文字になっているこのタイプの大文字小文字は、タイトルケースと呼ばれます。

したがって、名前がタイトルケースに含まれているかどうかを確認する必要があります。

1.はいの場合、フォーマットがタイトルの場合であるというメッセージを出力します。

2.それ以外の場合は、タイトルケースでフォーマットされた文字列のコピーを返します

python-string-title-case
  • Pythonには、文字列がタイトルの場合にあるかどうかをチェックする組み込みの文字列メソッドistitle()があります。

<str>.istitle()は、文字列<str>がタイトルの場合にフォーマットされている場合はTrueを返し、そうでない場合はFalseを返します。

  • また、Pythonの文字列メソッドtitle()は、タイトルケースでフォーマットされた文字列のコピーを返します。

これで、これら2つの方法を使用して問題を解決できます。

nameを引数として受け入れる関数check_titlecase()を定義します。

  • 入力文字列に対してistitle()メソッドを呼び出して、タイトルの場合にフォーマットされているかどうかを確認できます。
  • Trueの場合、文字列がすでにタイトルケースに入っていることを印刷できます。
  • それ以外の場合は、 title()メソッドを呼び出して、タイトルの場合に文字列のコピーを返すことができます。

次のコードセルは、 check_titlecase()関数の定義を示しています。

 def check_titlecase(name): if name.istitle(): print(f"'{name}' is already formatted in title case.") else: return name.title()

ここで、引数を指定してcheck_titlecase()メソッドを呼び出します。

 check_titlecase("jane smith") # Output Jane Smith

上記の出力では、文字列「JaneSmith」がタイトルケースに入っていることがわかります。

️別の例を見てみましょう。

 check_titlecase("agatha Christie") # Output Agatha Christie

今回は、タイトルを大文字にした文字列を使用して関数を呼び出しましょう。

 check_titlecase("Grace Hopper") # Output 'Grace Hopper' is already formatted in title case.

文字列がタイトルケースでフォーマットされ、関数が期待どおりに機能することが通知されます。

結論

これまでに説明した問題を要約してみましょう。

  • 文字列が回文であるかどうかを確認するには、文字列とその逆バージョンが等しいかどうかを確認します。 文字列のスライスまたは組み込みのメソッドを使用して、文字列を反転できます。
  • 2つの文字列がアナグラムであるかどうかを確認するには、並べ替えられたコピーが等しいかどうかを確認します。 また、文字列を並べ替えるには、組み込みのsorted()関数を使用します。
  • 名前がタイトルケースであるかどうかを確認するには、チェックに.istitle ()メソッドを使用し、.title()メソッドを使用して文字列のタイトルケースのコピーを取得します。

Python文字列に関するこのチュートリアルを楽しんでいただけたでしょうか。 次のステップとして、Pythonでリスト内包表記を使用する方法を学ぶか、Pythonで等しくない演算子について学びます。

幸せな学習とコーディング!