Pythonでリストや文字列を逆順に並べ替え(reverse, reversed)
Pythonでリストの要素を逆順に並べ替えるにはreverse(), reversed()およびスライスを使う。文字列やタプルを逆順に並べ替えたい場合はreversed()かスライスを使う。
逆順に並べ替えるのではなく昇順・降順にソートしたい場合は以下の記事を参照。
リスト型のメソッド reverse(): 元のリストを逆順に並べ替え
reverse()はリストに代表されるミュータブル(更新可能)なシーケンス型のメソッド。
元のリスト自体が書き換えられる破壊的処理。
l = [1, 2, 3, 4, 5]
l.reverse()
print(l)
# [5, 4, 3, 2, 1]
reverse()が返すのはNoneなので注意。
print(l.reverse())
# None
リスト以外のミュータブルなシーケンス型としては、例えばcollections.dequeがある。collections.dequeからもreverse()が利用可能。
組み込み関数 reversed(): 逆順に取り出すイテレータを生成
reversed()は組み込み関数。
reversed()は要素を逆順に取り出すイテレータを返す。元のリストは変更されない非破壊的処理。
l = [1, 2, 3, 4, 5]
print(type(reversed(l)))
# <class 'list_reverseiterator'>
print(l)
# [1, 2, 3, 4, 5]
reversed()はリストではなくイテレータを返すので注意。forループで回す場合はそのまま使えばよい。
for i in reversed(l):
print(i)
# 5
# 4
# 3
# 2
# 1
逆順のリストを取得したい場合はlist()でイテレータをリストに変換する。
l_reversed = list(reversed(l))
print(l_reversed)
# [5, 4, 3, 2, 1]
print(l)
# [1, 2, 3, 4, 5]
スライスで逆順に並べ替え
元のオブジェクトはそのままで逆順に並べ替えたい場合はスライスを使うことも可能。
スライスは[start:stop:step]の形で範囲や増分を指定する。start, stopを省略すると全体を選択し、stepを-1とすると後ろから一つずつ要素を取得するので、[::-1]とすると逆順に並べ替えられたオブジェクトが取得できる。
l = [1, 2, 3, 4, 5]
l_reversed = l[::-1]
print(l_reversed)
# [5, 4, 3, 2, 1]
print(l)
# [1, 2, 3, 4, 5]
スライスについての詳細は以下の記事を参照。
文字列やタプルを逆順に並べ替える方法
文字列、タプルはイミュータブル(更新不可)なので、元のオブジェクトを書き換えるreverse()メソッドは用意されていない。
文字列やタプルを並べ替えたい場合はreversed()かスライスを使う。
文字列を逆順に並べ替え
イテレータを文字列に直接変換することはできないので、reversed()を使う場合はイテレータをリスト(一文字ずつが要素として格納されたリスト)に変換してからjoin()で一つの文字列に連結する。
s = 'abcde'
s_reversed_list = list(reversed(s))
print(s_reversed_list)
# ['e', 'd', 'c', 'b', 'a']
s_reversed = ''.join(list(reversed(s)))
print(s_reversed)
# edcba
スライスを使った方法はリストと同じ。こちらのほうが簡単。
s_reversed = s[::-1]
print(s_reversed)
# edcba
タプルを逆順に並べ替え
イテレータをタプルに変換するにはtuple()を使う。
t = (1, 2, 3, 4, 5)
t_reversed = tuple(reversed(t))
print(t_reversed)
# (5, 4, 3, 2, 1)
スライスを使った方法はリストと同じ。
t_reversed = t[::-1]
print(t_reversed)
# (5, 4, 3, 2, 1)