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
の要素を逆から参照できます。
あとはそれをdst
にappend()
していけば逆順になったリストが手に入ります。
リストを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]
カウント変数i
をlen(lis) - 1
で初期化しておきます。
そしてwhile i >= 0:
でi
が0以上の間繰り返し、i -= 1
でi
をデクリメントしていきます。
こうすると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で文字列やリストを逆順にする方法を解説しました。
なにか参考になれば幸いです。
🦝 < リバース!
🦝 < おええ!