ユーニックス総合研究所

  • home
  • archives
  • python-gyakujyun

Pythonで文字列やリストを逆順にする方法(スライス、reverseなど)

  • 作成日: 2023-07-05
  • 更新日: 2023-12-25
  • カテゴリ: Python

Pythonで文字列やリストを逆順にする

Pythonで文字列やリストを逆順にする方法を解説します。
具体的にはreverseメソッドやreversed関数、スライスなどを使います。

関連記事
Djangoでオブジェクトを一括作成・更新【bulk_create, bulk_update】
DjangoのModel.objects.filter()の使い方【QuerySet】
Djangoのmodelのcreate()の使い方【Python】
Django入門: ルートの設定 ~ 簡単な一行掲示板アプリを作る その4【Windows10】
NumPyのappend()の使い方: 配列の末尾に要素を追加
Numpyのarangeの使い方: 指定範囲の数列を生成する
Python3でYoutube Data APIを使ってキーワード検索する
PythonからC言語(my.puts)を呼び出して実行する

文字列を逆順にする方法

文字列を逆順にするにはスライスを使います。

文字列[::-1]  

というスライスを行うと文字列が逆順になります。

s = 'Hello'  

print(s[::-1])  
# olleH  

[::-1]というスライスは元の文字列を逆順にコピーするスライスです。
スライスの角かっこの中の3つ目(-1)にはステップ数を指定しますが、これをマイナスにすると逆方向になります。

文字列にもreversed関数は使えます。

s = 'Hello'  
s = reversed(s)  

print(s)  
# <reversed object at 0x0000012E2D2E78E0>  

reversed関数はオブジェクトを逆順にするイテレーターを返すだけなので、このイテレーターを文字列にしたい場合は、

s = 'Hello'  
s = ''.join(list(reversed(s)))  

print(s)  
# olleH  

というような込み入った処理を行います。
スライスを使った方が簡単ですね。

リスト、タプルを逆順にする方法

リストやタプルを逆順にするにはreverseメソッドを使います。
以下のコードではリストを使っていますが、これはタプルに置き換えても同じです。

lis = [1, 2, 3]  

lis.reverse()  

print(lis)  
# [3, 2, 1]  

reverseメソッドはリストを破壊的に逆順にします。
元のリストを破壊したくない場合はコピーを取ってから逆順にするか、

lis = [1, 2, 3]  
lis2 = lis[::]  # コピー  
lis2.reverse()  

print(lis)  
# [1, 2, 3]  

print(lis2)  
# [3, 2, 1]  

あるいは非破壊的な関数であるreversed関数を使います。

lis = [1, 2, 3]  
result = reversed(lis)  

print(result)  
# <list_reverseiterator object at 0x0000024F0DC92340>  

reversed関数はオブジェクトを逆順にするイテレーターを返すだけなので、これを再びリストに変換したい場合は以下のようにします。

lis = [1, 2, 3]  
result = reversed(lis)  
result = list(result)  

print(result)  
# [3, 2, 1]  

また「リスト → reversed → タプル」というように逆順にしたオブジェクトをタプルにしたい場合は以下のようにtupleを使います。

lis = [1, 2, 3]  
result = reversed(lis)  
result = tuple(result)  

print(result)  
# (3, 2, 1)  

またリストにもスライスが使えます。

lis = [1, 2, 3]  
lis = lis[::-1]  

print(lis)  
# [3, 2, 1]  

lis[::-1]は元のリストを非破壊的に逆順にしてコピーを返します。

リストをfor文で逆順にする方法

リストをfor文で逆順にするには以下のようなコードを書きます。

lis = [1, 2, 3]  
dst = []  

for i in range(len(lis) - 1, -1, -1):  
    dst.append(lis[i])  

print(dst)  
# [3, 2, 1]  

range(len(lis) - 1, -1, -1)というのは開始点のインデックスをlisの長さに。
そして終了点を-1にしてステップ数を-1にしてカウント変数をデクリメントしていく指定です。
このrange()で生成したインデックスでlisを参照するとlisの要素を逆から参照できます。
あとはそれをdstappend()していけば逆順になったリストが手に入ります。

リストをwhile文で逆順にする方法

リストをwhile文で逆順にするには以下のようなコードを書きます。

lis = [1, 2, 3]  
dst = []  
i = len(lis) - 1  

while i >= 0:  
    dst.append(lis[i])  
    i -= 1  

print(dst)  
# [3, 2, 1]  

カウント変数ilen(lis) - 1で初期化しておきます。
そしてwhile i >= 0:iが0以上の間繰り返し、i -= 1iをデクリメントしていきます。
こうするとdstには逆順になったリストが構築されます。

速度比べ

ではこれまでに登場した処理の速度を比べてみましょう。
どれが一番早いでしょうか。

比べるのは

  • スライス
  • reverse
  • reversed
  • for文
  • while文

です。

import time  

def gen_lis():  
    return list(range(40000000))  

def test_slice():  
    lis = gen_lis()  
    lis[::-1]  

def test_reverse():  
    lis = gen_lis()  
    lis.reverse()  

def test_reversed():  
    lis = gen_lis()  
    list(reversed(lis))  

def test_for():  
    lis = gen_lis()  
    dst = []  

    for i in range(len(lis) - 1, -1, -1):  
        dst.append(lis[i])  

def test_while():  
    lis = gen_lis()  
    dst = []  
    i = len(lis) - 1  

    while i >= 0:  
        dst.append(lis[i])  
        i -= 1  

def check(fn):  
    start = time.time()  
    fn()  
    end = time.time()  
    dif = end - start  
    print(str(fn), dif)  


check(test_slice)  
check(test_reverse)  
check(test_reversed)  
check(test_for)  
check(test_while)  

# <function test_slice at 0x0000022CB673AC10> 2.70727801322937  
# <function test_reverse at 0x0000022CB673AD30> 1.361635446548462  
# <function test_reversed at 0x0000022CB673ADC0> 2.0449917316436768  
# <function test_for at 0x0000022CB673AE50> 4.571193218231201  
# <function test_while at 0x0000022CB673AEE0> 5.140025854110718  

筆者の環境(Windows10 64ビット)では上記の結果になりました。
reverseメソッドが一番早く、while文が一番遅いという結果になりました。
できるだけreverseメソッドを使った方がよさそうですね。
スライスが意外と遅いというのもわかりました。

おわりに

今回はPythonで文字列やリストを逆順にする方法を解説しました。
なにか参考になれば幸いです。

🦝 < リバース!

🦝 < おええ!