プログラミング

Pythonで文字列を反転するには?逆順にする方法も!(文字列反転:reverse:スライス:[::-1]:逆順など)

当サイトでは記事内に広告を含みます

Pythonで文字列を逆順にしたい場面は、パリンドローム(回文)の判定、データの整形、アルゴリズムの実装など様々なシーンで出てきます。Pythonには文字列を反転するための便利な方法が複数用意されており、スライスを使ったシンプルな1行表記から、reverseやjoinを組み合わせた方法まで幅広く対応できます。

他の言語では文字列反転のための専用メソッドが用意されていることも多いですが、Pythonではスライスの[::-1]記法が最もよく使われます。シンプルでありながら非常に強力な書き方で、Pythonらしいコードの代表例のひとつといえるでしょう。

この記事では、Pythonで文字列を反転・逆順にする方法をスライス・reversed・joinの組み合わせなど複数のアプローチで、サンプルコードとともにわかりやすく解説していきます。

Pythonで文字列を反転するには[::-1]スライスが最もシンプルな方法

それではまず、Pythonで文字列を反転する最も基本的かつ代表的な方法について解説していきます。

Pythonで文字列を逆順にするとき、最もシンプルでPythonicな書き方がスライスの[::-1]記法です。スライスは「文字列[開始:終了:ステップ]」という構文で、ステップに-1を指定すると末尾から先頭に向かって1文字ずつ取り出します。


# [::-1]スライスで文字列を反転
text = "ドラゴンフルーツ"
reversed_text = text[::-1]
print(reversed_text)

# 英語でも同様
text2 = "avocado"
print(text2[::-1])

# 出力結果:ツーールンゴラド
# 出力結果:odacova

たった1行、[::-1]をつけるだけで文字列全体が逆順になります。変数に代入しなくても式の中で直接使えるため、非常に使い勝手のよい方法です。

[::-1]はPythonのスライス構文を利用した文字列反転の定番イディオムです。「開始と終了を省略してステップを-1にする」ことで、文字列全体を末尾から先頭に向かって取り出します。Pythonエンジニアの間では最もよく使われる反転方法です。

スライス記法の仕組みを理解する

[::-1]がなぜ逆順になるのか、スライス記法の仕組みを確認しておきましょう。


# スライスの仕組みを確認
text = "GORILLA"

# 通常のスライス(先頭から3文字)
print(text[0:3])

# ステップを2にすると1文字おきに取り出す
print(text[::2])

# ステップを-1にすると末尾から取り出す(反転)
print(text[::-1])

# ステップを-2にすると末尾から1文字おき
print(text[::-2])

# 出力結果:GOR
# 出力結果:GIL
# 出力結果:ALLIROG
# 出力結果:ALO

ステップの値がマイナスになると取り出す方向が逆転します。-1にすることで末尾から先頭へ1文字ずつ順番に取り出すため、結果として文字列が反転されます。

一部だけ反転するスライスの応用

開始・終了位置を指定することで、文字列の一部だけを逆順にすることもできます。


# 一部だけ反転する
text = "keyboard"

# インデックス0〜4の範囲を反転
print(text[4::-1])

# インデックス7〜3の範囲を反転
print(text[7:3:-1])

# 出力結果:draykey → yboark(0〜4の逆順)
# 出力結果:droa

# 出力結果:yboar
# 出力結果:droa

開始・終了位置を指定したスライスは、特定の範囲だけを逆順で取り出したいときに活用できます。

f文字列と組み合わせて反転を使う


# f文字列と組み合わせる
items = ["アボカド", "サーモン", "ドラゴンフルーツ"]

for item in items:
    print(f"{item} → 反転:{item[::-1]}")

# 出力結果:アボカド → 反転:ドカボア
# 出力結果:サーモン → 反転:ンモーサ
# 出力結果:ドラゴンフルーツ → 反転:ツーールンゴラド

f文字列の{}の中に直接[::-1]を書くことで、変数を別途用意せずにインラインで反転した文字列を埋め込めます。

reversed()とjoin()を使って文字列を反転する方法

続いては、reversed()関数とjoin()を組み合わせて文字列を反転する方法を確認していきます。

reversed()はイテラブルを逆順に返す組み込み関数です。文字列にreversed()を適用するとイテレータが返るため、join()で結合して文字列に戻す必要があります。スライスより少し記述量は増えますが、処理の意図が明確に伝わる書き方といえます。

reversed()とjoin()の基本的な使い方


# reversed() + join()で文字列を反転
text = "ゴリラとロバ"
reversed_text = "".join(reversed(text))
print(reversed_text)

text2 = "dragon_fruit"
reversed_text2 = "".join(reversed(text2))
print(reversed_text2)

# 出力結果:バロとラリゴ
# 出力結果:tiurf_nogarD → tiurf_nogard
# 出力結果:tiurf_nogard

reversed()が返すのはイテレータオブジェクトなので、””join()で各文字を連結することで文字列に変換します。スライスに比べると冗長ですが、「逆順にして結合する」という処理の流れが読み取りやすい書き方です。

リスト変換経由で反転する方法


# list()に変換してからreverse()を使う方法
text = "keyboard"

# 文字をリストに変換
chars = list(text)
print(f"変換前:{chars}")

# リストのreverse()メソッドで逆順に(インプレース操作)
chars.reverse()
print(f"反転後:{chars}")

# join()で文字列に戻す
result = "".join(chars)
print(f"文字列:{result}")

# 出力結果:変換前:['k', 'e', 'y', 'b', 'o', 'a', 'r', 'd']
# 出力結果:反転後:['d', 'r', 'a', 'o', 'b', 'y', 'e', 'k']
# 出力結果:文字列:draobyek

list()でいったんリストに変換し、リストのreverse()メソッドで逆順にしてからjoin()で文字列に戻す方法です。処理ステップが多くなりますが、各ステップを確認しながら理解を深めたい場合に向いています。

各反転方法のパフォーマンス比較

3つの方法のコードの簡潔さと特徴を整理しておきましょう。

方法 コード例 特徴
スライス[::-1] text[::-1] 最もシンプル・Pythonic・推奨
reversed()+join() “”.join(reversed(text)) 意図が明確・やや冗長
list+reverse()+join() chars = list(text); chars.reverse(); “”.join(chars) ステップが多い・学習目的向け

実務では[::-1]スライスが最も推奨される書き方です。コードレビューやチーム開発でも広く認知されている方法なので、まずこちらを覚えておきましょう。

文字列反転の実践的な応用パターン

続いては、文字列反転を活用した実践的なプログラムのパターンを確認していきます。

文字列の反転は単独で使うだけでなく、パリンドローム判定・暗号化・データ整形など、様々な処理の基盤として活用できます。

パリンドローム(回文)を判定する


# パリンドローム(回文)の判定
def is_palindrome(text):
    # 大文字・小文字・スペースを統一して比較
    cleaned = text.lower().replace(" ", "")
    return cleaned == cleaned[::-1]

words = ["racecar", "gorilla", "level", "avocado", "madam", "ロバ"]

for word in words:
    result = "回文です" if is_palindrome(word) else "回文ではありません"
    print(f"「{word}」:{result}")

# 出力結果:「racecar」:回文です
# 出力結果:「gorilla」:回文ではありません
# 出力結果:「level」:回文です
# 出力結果:「avocado」:回文ではありません
# 出力結果:「madam」:回文です
# 出力結果:「ロバ」:回文ではありません

元の文字列と反転した文字列が一致すれば回文という判定ロジックです。[::-1]を使うと判定部分が非常にシンプルに書けます。

単語単位で逆順にする方法


# 文字ではなく単語単位で逆順にする
sentence = "アボカド サーモン ドラゴンフルーツ ゴリラ"

# split()でリストにしてから逆順に結合
words = sentence.split()
reversed_sentence = " ".join(words[::-1])
print(reversed_sentence)

# 英文でも同様
eng = "keyboard mouse monitor gorilla"
print(" ".join(eng.split()[::-1]))

# 出力結果:ゴリラ ドラゴンフルーツ サーモン アボカド
# 出力結果:gorilla monitor mouse keyboard

split()でスペース区切りのリストにしてから[::-1]で逆順にし、join()で再結合するパターンです。文字単位ではなく単語単位で逆順にしたい場合に使えます。

数値を反転して回文数を判定する


# 数値を反転して回文数かどうか判定する
def is_palindrome_number(n):
    s = str(n)
    return s == s[::-1]

numbers = [121, 123, 1221, 12321, 500, 9009]

for num in numbers:
    result = "回文数" if is_palindrome_number(num) else "回文数ではない"
    print(f"{num}:{result}")

# 出力結果:121:回文数
# 出力結果:123:回文数ではない
# 出力結果:1221:回文数
# 出力結果:12321:回文数
# 出力結果:500:回文数ではない
# 出力結果:9009:回文数

数値をstr()で文字列に変換してから[::-1]で反転し、元と比較するアルゴリズムです。競技プログラミングや数学的な処理でよく登場するパターンです。

文字列反転に関するよくある疑問と注意点

続いては、文字列反転を使う際によくある疑問と注意すべきポイントを確認していきます。

文字列反転はシンプルな操作ですが、Unicodeの結合文字や絵文字など特殊な文字を含む場合には注意が必要です。また、Pythonの文字列がイミュータブルである点も押さえておきましょう。

Pythonの文字列はイミュータブルで元の文字列は変わらない


# 文字列はイミュータブル(変更不可)
text = "avocado"
reversed_text = text[::-1]

print(f"元の文字列:{text}")        # 元の文字列は変わらない
print(f"反転した文字列:{reversed_text}")

# リストのreverse()はインプレース(元のリストを変更)するが
# 文字列にはreverse()メソッドはない
# text.reverse()  # AttributeError

# 出力結果:元の文字列:avocado
# 出力結果:反転した文字列:odacova

[::-1]は新しい文字列を生成して返すため、元の文字列には影響しません。Pythonの文字列はイミュータブルなので、reverse()メソッドは存在しない点も覚えておきましょう。

絵文字や結合文字を含む文字列の反転


# 絵文字を含む文字列の反転
text1 = "ゴリラ🦍とロバ🫏"
print(text1[::-1])

# 結合文字(例:濁点が別コードポイントの場合)を含むと崩れる可能性がある
# 通常の日本語文字列は問題なく動作する
text2 = "サーモン定食"
print(text2[::-1])

# 出力結果:🫏バロと🦍ラリゴ
# 出力結果:食定ンモーサ

通常の日本語や絵文字のみの文字列は[::-1]で問題なく反転できます。ただし濁点や半濁点が結合文字として別コードポイントで表現されているケースでは、反転後に表示が崩れる場合があります。

大量の文字列を反転する際のメモリ効率


# 大量の文字列反転のパフォーマンス比較
import time

# 長い文字列を生成
long_text = "dragon_fruit_and_avocado_and_salmon_" * 10000

# スライスによる反転
start = time.time()
for _ in range(1000):
    result = long_text[::-1]
slice_time = time.time() - start

# reversed()+join()による反転
start = time.time()
for _ in range(1000):
    result = "".join(reversed(long_text))
join_time = time.time() - start

print(f"スライス:{slice_time:.4f}秒")
print(f"reversed+join:{join_time:.4f}秒")

# 出力結果:スライス:0.XXXX秒
# 出力結果:reversed+join:0.XXXX秒

一般的にスライスの方がreversed()+join()より高速に動作するとされています。大量の文字列処理ではスライスを選ぶとパフォーマンス面でも有利です。

まとめ

この記事では、Pythonで文字列を反転・逆順にする方法について、[::-1]スライスの基本からreversed()+join()・リスト変換・応用パターンまで幅広く解説しました。

Pythonで文字列を反転する最もシンプルでPythonicな方法は[::-1]スライスです。1行で書けるうえ、パフォーマンス面でも優れています。reversed()+join()は処理の意図を明確に表現したい場面で選択肢になります。

パリンドローム判定・単語単位の逆順・数値の回文チェックなど、文字列反転の応用パターンはアルゴリズムの実装でも頻繁に登場します。今回紹介した方法をぜひ実際のコードで試してみてください。

Pythonで文字列を反転するならtext[::-1]が最短・最速・最もPythonicな書き方です。スライスの仕組みを理解しておくと、反転だけでなく1文字おきの取り出しや範囲指定の逆順など、様々な場面で応用できるようになります。