文字列の反転は、実際の場面ではあまりないことかもしれませんが、就職の面接ではかなり頻繁に直面する操作です。特に、文字列を反転させるメソッドが組み込まれていないプログラミング言語での求人に応募している場合は、なおさらです。文字列を反転させることで、面接官は、あなたが問題を分析し、ゼロから解決策を構築する方法を正確に把握することができます。
また、この問題には多くの解答が存在するため、アルゴリズムによる実行速度の違いを意識して、最適な解答を導き出すことができるチャンスでもあります。
この記事では、Pythonで文字列を反転する方法について見ていきます。いくつかの解決策を検討し、それらを比較することで、あなたのニーズに最も適したものを選択できるようにします。
もちろん、文字列を反転させる必要性に直面するのはインタビューだけではありません。例えば、反転した文字列を扱うときにずっと簡単に解決できる正規表現の問題があります。
Pythonの文字列
Pythonの文字列は、バイトの不変配列で、より具体的には、Unicode文字を表すバイトの列です。実際には、文字列は一対の引用符(シングルまたはダブル)で囲まれた文字のシーケンスとしてコードで書かれていますが、それらは内部的にはUnicodeコードのシーケンスとして格納されています。
example_str = "Hello World!"
# The same as:
# example_str = 'Hello World!'
注:Pythonで文字列を扱うために使われる実際のオブジェクトは、 str
オブジェクトと呼ばれます。これは基本的に文字列のデータ型を表します。
Pythonの文字列の重要な特徴の1つは、文字列が不変であることです。つまり、作成された後に変更することはできません。文字列を変更する唯一の方法は、その変更されたコピーを作成することです。これは文字列に対する多くの操作を複雑にしています。このことは、文字列に対する多くの操作を複雑にしています。この記事で特に関心のある、文字列を反転させる操作についても同じことが言えます。
Pythonで文字列を反転させる。
さて、基本的なことはすべてカバーできたので、次は実際にPythonで文字列を反転させる方法について見ていきましょう。前にも述べたように、いくつかの方法があります。この記事では、最もよく使われる方法をいくつか取り上げます。それぞれの方法には長所と短所があり、より効率的だが可読性に劣るものもあります。一方、本当に読みやすく、理解しやすいものもありますが、その代償として効率はよくありません。
以下の節では、文字列 "Hello World!"
を "!dlroW olleH"
に反転させることにします。
example_str = "Hello World!"
推奨される解決策 スライス記法の使用
Pythonの文字列のもうひとつの重要な特性は、文字列がスライス可能であることです。これは、元の文字列から部分文字列を抽出できることを意味します。Pythonはスライス演算子を用いて、これを非常に簡単に実行する方法を提供します。
注:Pythonで文字列をスライスすることについてもっと学びたい場合は、記事「Python: 文字列のスライス記法”
Pythonのスライス演算子は次のような構文になります – [start:end:step]
. これは start
から end
までの部分文字列を切り出します。もし step
が正の数であれば、 start
は end
よりも小さくなければならないので、スライス演算子は前方に向かう部分文字列を作成します。一方、 step
が負の数である場合、部分文字列は元の文字列の後方に向かって作成されます。したがって、 step
を -1
に設定し、 start
と end
を空白にすると、文字列全体を効率的に逆行させることになります。
example_str = "Hello World!"
reversed_str = example_str[::-1]
print(reversed_str)
先ほど説明した方法で example_str
にスライス演算子を使用すると、元の文字列を反転させたものが得られます。
"!dlroW olleH"
Pythonで文字列を反転させるこの方法は、大きな入力文字列に対して最も効率的だと考えられていますが、その代償として可読性が悪くなります。特にPythonのスライス記法に慣れていない人にとってはそうです。これを改善するために、スライスを関数でラップすることで、最終的なコードの可読性を向上させることができます。
def reverse_string(s):
return s[::-1]
後で、この関数を普通のスライス演算子の代わりに使って文字列を反転させると、結果の文字列は前と同じように "!dlroW olleH"
となります。
reversed_str = reverse_string(example_str)
アドバイス コードの各セクションを関数でラップすることは、一般的に良い習慣です! コードの可読性を高めるだけでなく、実際に、よりモジュール化された再利用可能なコードを作成するのに役立ちます。したがって、このセクションで示されているのと同じ方法で、以下の各コードスニペットを関数でラップすることができます。
join()とreversed()の使用法
スライスは速度の点では最も優れていますが、可読性の点では2つのPython組み込みメソッド、 str.join()
と reversed()
を組み合わせるのが堅実な方法です。
まず、reversed()
は引数として渡された文字列を反転させたイテレータを返します。これにより、str.join()
関数を使って、元の文字列を逆引きして、その文字を空の文字列に追加することができます。
example_str = "Hello World!"
reversed_str = ''.join(reversed(example_str))
print(reversed_str)
これは元の文字列の逆コピーを作成します。
"!dlroW olleH"
注:Pythonのイテレータの概念に慣れていない場合は、”Introduction to Python Iterators “をお読みください。
forループの使用
Pythonではループを使って文字列を逆行させることもできます。最初に考えるのは for
ループです。このループを使うと、元の文字列を順方向と逆方向の両方向に反復処理することができます。文字列を反転させたいので、最初に思いつくのは、文字列の端から端まで反復して、それぞれの文字を新しい文字列に追加することです。そのためには、reversed()
関数を使用します。
example_str = "Hello World!"
reversed_str = ""
for i in reversed(example_str):
reversed_str += i
print(reversed_str)
元の文字列を逆方向に反復処理し、各文字を resulting_str
に追加しています。
"!dlroW olleH"
注:反転した文字列にそれぞれの文字を追加していることに注目してください。しかし、Pythonの文字列は不変です。Pythonは基本的に、文字を追加するたびに文字列の修正コピーを作成し、その結果を不変の文字列として固めて返すので、このようにすることができます。
別の方法としては、元の文字列を最初から最後まで繰り返し処理し、ループの中で元の文字列の逆バージョンを作成することができます。
example_str = "Hello World!"
reversed_str = ""
for i in example_str:
reversed_str = i + reversed_str
print(reversed_str)
これは、ループの中で反転したイテレータを使ったのと同じ結果になります。
whileループの使用
文字列を反転させるのに使えるもうひとつのループは while
ループです。この方法は他の方法より少し複雑ですが、文字列の反転がどのように行われるかを低レベルで理解することができます。
example_str = "Hello World!"
reversed_str = ""
i = len(example_str) - 1
while i >= 0:
reversed_str += example_str[i]
i -= 1
print(reversed_str)
その結果、次のようになります。
"!dlroW olleH"
結論
この記事で見てきたように、Pythonで文字列を反転させる方法にはたくさんのアプローチがあり、それぞれに長所と短所があります。一般的に言って、最も時間をかけて選択すべき方法はスライス演算子です。これは最も効率的で最もPythonicな文字列の逆変換方法です。他の方法は効率が悪いので、もしあなたのコードで実行速度が重要であるなら、それらを使う前によく考えてみてください。