Pythonでリスト・タプル・文字列を逆順に並べ替える(reverse, reversed)

Pythonのreverse()メソッド、reversed()関数、スライス操作について解説します。

Pythonでリスト・タプル・文字列を逆順に並べ替える(reverse, reversed)

Pythonのリスト・タプル・文字列の要素を逆順に並べ替える方法について解説します。それぞれのオブジェクトによって、使うことができる方法が異なるので注意してください。

リスト・タプル・文字列の要素をソートしたり、ランダムにシャッフルしたい場合には、以下の記事を参考にしてください。

リストの要素を逆順に並べ替える

Pythonのリストの要素を逆順に並べ替えるためには、以下の3つの方法があります。

  • リスト型のreverse()メソッドを使う方法(元のリストを変更する)
  • 組み込み関数reversed()を使う方法(元のリストを変更しない)
  • リストのスライス操作を使う方法(元のリストを変更しない)

注意すべきポイントは、元のリストがそのまま残るかどうかという点です。

リスト型のreverse()メソッドを使う(元のリストを変更する)

Pythonのリスト型のメソッドには、リストの要素を逆順にするreverse()メソッドあります。これは元のリスト自体に変更を加えるもので、いわゆる破壊的処理(元の要素を書き換える処理)になります。

reverse()メソッド自体の戻り値はNoneになります。

# リスト型のreverse()メソッド

ordered_list = [1, 2, 3, 4, 5]
ordered_list.reverse() # 元のリストの順序が変わる
print(ordered_list)
# [5, 4, 3, 2, 1]

# 戻り値はNone
returned_value = ordered_list.reverse()
print(returned_value)
# None

組み込み関数reversed()を使う(元のリストを変更しない)

Pythonの組み込み関数には、引数に与えたリストの要素を逆順に取得するイテレータを生成するreversed()関数があります。これはリスト型のreverse()メソッドと違って、元のリストの順序は変えないため、いわゆる非破壊的処理(元の要素は書き換えない処理)になります。

# 組み込み関数reversed()関数

# reversed()関数はイテレータを返す
ordered_list = [1, 2, 3, 4, 5]
reversed_iter = reversed(ordered_list)
print(reversed_iter)
# <list_reverseiterator object at 0x7fb9be15fd90>


# 元のリストの順序は変わらない
print(ordered_list)
# [1, 2, 3, 4, 5]


# for文などで値を取得すると、要素が逆順になっている
for i in reversed_iter:
    print(i)

# 5
# 4
# 3
# 2
# 1

reversed()関数の戻り値はイテレータなので、リスト化するにはlist()関数を使えば良いです。

# list()関数でリスト化する

ordered_list = [1, 2, 3, 4, 5]
reversed_list = list(reversed(ordered_list))
print(reversed_list)
# [5, 4, 3, 2, 1]

# 元のリストは変わっていない
print(ordered_list)
# [1, 2, 3, 4, 5]

リストのスライス操作を使う(元のリストを変更しない)

Pythonのリスト型のスライス操作を使うことでも、要素を逆順にすることができます。

Pythonのスライスは[start:stop:step]の形で記述し、startはスライスの開始位置、stopはスライスの終了位置、stepは要素をいくつごとに取得するかを指定します。startstopを省略するとリストの全ての要素を選択し、step-1を指定するとリストの要素を逆順で取得するため、リスト全体を逆順に並べ替える操作になります。

スライスは別のリストを戻り値として返し、元のリストの要素を変更しません

# リスト型のスライス操作で要素を逆順にする

ordered_list = [1, 2, 3, 4, 5]
reversed_list = ordered_list[::-1]
print(reversed_list)
# [5, 4, 3, 2, 1]

# 元のリストは変わらない
print(ordered_list)
# [1, 2, 3, 4, 5]

リスト全体の要素を対象とするreverse()メソッドやreversed()関数と違って、リストの一部の要素に対して並び順を変更することができるため、より柔軟な操作を実現できます。

タプルの要素を逆順に並べ替える

タプルの要素を逆順に並べ替えるには、リストと同様にreversed()関数かスライス操作を使います。

タプルはイミュータブル(変更不可)なオブジェクトなため、リストのreverse()メソッドのように元のオブジェクト自体に変更を加えるメソッドは用意されていません

# タプルの要素を逆順に並べ替える

# 組み込み関数reversed()関数でイテレータを返す
ordered_tuple = (1, 2, 3, 4, 5)
reversed_iter = reversed(ordered_tuple)
print(reversed_iter)
# <reversed object at 0x7fb9be15fd90>

# 元のタプルの順序は変わらない
print(ordered_tuple)
# (1, 2, 3, 4, 5)

# tuple()関数でタプルに戻し、逆順になる
print(tuple(reversed_iter))
# (5, 4, 3, 2, 1)


# スライスを使った方法
ordered_tuple = (1, 2, 3, 4, 5)
reversed_tuple = ordered_tuple[::-1]
print(reversed_tuple)
# (5, 4, 3, 2, 1)

文字列の要素を逆順に並べ替える

Pythonの文字列もイミュータブル(変更不可)なオブジェクトです。文字列を逆順に並べ替えるには、スライス操作を使います。

# スライス操作で文字列を逆順に並べ替える

ordered_str = "あいうえお"
reversed_str = ordered_str[::-1]
print(reversed_str)
# おえういあ

# 元の文字列は変わらない
print(ordered_str)
# あいうえお

リストやタプルなどと同様に、reversed()関数を使うこともできますが、イテレータをそのまま文字列に変換することができないので、処理が面倒です。文字列を逆順にするなら上記のようにスライス操作を使いましょう。