文字列操作に関するPythonプログラム
公開: 2022-04-26このチュートリアルでは、文字列操作に関するよくある質問を解決するPythonプログラムを作成します。
Python文字列が回文、アナグラムであり、タイトルケースに含まれているかどうかを確認する方法を学習します。
Python文字列:クイックレビュー
Pythonでは、文字列は強力な組み込みデータ型です。 一連の文字を格納できます。
Python文字列でのインデックス付け:すべてのPython反復可能オブジェクトと同様に、文字列もゼロインデックス付けされます。 したがって、長さNの文字列の有効なインデックスは、0、1、2からN –1までです。
Pythonは、文字列の末尾から要素にアクセスするための負のインデックスもサポートしています。 したがって、-1は文字列の最後の文字のインデックス、-2は文字列の最後から2番目の文字のインデックスというように続きます。
Python文字列の不変性:さらに、Pythonの文字列は不変であるため、その場で変更することはできません。 ただし、それらに対していくつかの文字列メソッドを呼び出して、文字列のコピーを取得し、目的の結果を得ることができます。
Python文字列の基本を確認したので、次に、いくつかの単純で興味深い問題の解決に進みましょう。
はじめましょう。
Python文字列が回文であるかどうかを確認します
問題:Python文字列が与えられたら、それが回文であるかどうかを確認します。
はいの場合、Trueを返します。 それ以外の場合は、Falseを返します。
したがって、最初の問題は、特定の文字列が回文であるかどうかを確認することです。
回文は、左から右、および右から左に同じものを読み取る文字列です。 いくつかの例をリストアップしましょう:レースカー、参照、レベル、マダム、レーダーなど。
この問題を解決する手順は次のとおりです。
- 文字列の逆コピーを取得し、必要に応じて別の変数に格納します。
- 元の文字列と反転した文字列の値を比較します。
- それらが等しい場合、文字列は回文です。 したがって、 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
リストに追加します。
上記の出力でわかるように、 palindromes
はstr_list
内のすべてのパリンドローム文字列のリストです。
2つのPython文字列がアナグラムであるかどうかを確認します
インタビューで出くわす可能性のあるもう1つのよくある質問は、文字列str1
とstr2
のペアがアナグラムであるかどうかを確認することです。
2つの文字列の文字数がまったく同じである場合、2つの文字列はアナグラムと呼ばれます。 これは、他の文字列の文字を並べ替えたり並べ替えたりすることで、一方の文字列を取得できることを意味します。
アナグラムの例には、state-taste、save-vase、elbow-belowなどがあります。
Pythonでカウンターオブジェクトを使用してアナグラムをチェックする方法
簡単で直感的な方法は、2つの文字列の各文字の出現回数を計算することです。 次に、カウントが等しいかどうかを確認します。
これは、 itertools
モジュールのCounter
オブジェクトを使用してさらに簡単に実行できます。 Counterオブジェクトは、Pythonディクショナリを返します。文字をキーとして、対応するカウントを値として使用します。
以下に示すように、文字列"save"
と"vase"
について考えてみます。
str1 = "save" str2 = "vase"
ここで、 c1
とc2
は、それぞれ文字列str1
とstr2
の文字数を含むカウンターオブジェクトです。
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
は、 str1
とstr2
がアナグラムであるため、 True
を返します。
このロジックを使用して、先に進み、2つのパラメーターword1
とword2
を使用して関数are_anagrams()
を定義できます。 関数本体で、 Counter(word1) == Counter(word2)
かどうかを確認します。
def are_anagrams(word1, word2): if Counter(word1) == Counter(word2): return True else: return False
️確認するには、 str1
、 str2
を引数としてare_anagrams()
を呼び出します。 str1
とstr2
はアナグラム(「保存」と「花瓶」)であるため、関数は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には、文字列がタイトルの場合にあるかどうかをチェックする組み込みの文字列メソッド
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で等しくない演算子について学びます。
幸せな学習とコーディング!