Pythonのリストを逆順に並び替えるには、次の3つの方法が使えます。
- reverse()メソッド
- 逆順スライス
- reversed()関数
それぞれわかりやすく解説していきたいと思います。なお、混乱のないようにお伝えしておくと、ここで解説するのは「逆順」にする方法であり「降順」にする方法ではありません。
降順ソートに関しては「Pythonでリストの要素をソートする」をご覧ください。
1. reverse()メソッド
reverse()メソッドは、元のリストの要素を逆順で並び替えます。
nums = [1, 3, 2, 5, 4]
nums.reverse()
print(nums)
要素を逆順にした新しいリストを作るのではなく、あくまでも元のリストを並び替えます。reverse()の返り値自体はNoneですので、メソッドの実行結果そのものを出力することのないようにしましょう。
nums = [1, 3, 2, 5, 4]
print(nums.reverse())
2. 逆順スライス
スライスを使う方法でも、逆順並び替えが可能です。リストのスライスについては「Pythonのリストのスライスと分割」で解説しています。
nums = [1, 3, 2, 5, 4]
r_nums = nums[::-1]
print(r_nums)
3. reverse()メソッドとスライスの速度比較
reverse()メソッドとスライスでは前者の方が処理が早いです。以下は、それぞれ10万回試行した時の平均速度です。
まずreverse()メソッドでは平均114ナノ秒でした。
%%timeit -n 100000
nums = [1, 3, 2, 5, 4]
nums.reverse()
次にスライスでは平均168ナノ秒でした。
%%timeit -n 100000
nums =[1, 3, 2, 5, 4]
r_nums = nums[::-1]
これらの点から、リストの要素を逆順に並び替えたい場合はreverse()メソッドを基本にすると良いと言えます。
4. reversed()関数
reversed()関数は、リストの要素を逆順にしたイテレータを作成します。
最初にイテレータについて少し補足しておきます。
まず、リストは最初から値を保持しているためコンピュータのメモリを消費します。リストが大きければ大きいほど、この負担は増します。
一方でイテレータは、コードを実行する時に値を生成します。そのためコンピュータへの負担が少なくなります。
この点から、for文で要素を一つずつ取り出すような処理を行うには、特に格納されているデータ量が多い時ほど、イテレータは良い選択肢になります。
実際に見てみましょう。
以下のように、reversed()関数を実行するとイテレータ型オブジェクトが返ってきます。
nums = [1, 3, 2, 5, 4]
reversed(nums)
次のように、イテレータをfor文で回すことによって要素を一つずつ取り出すことができます。
for i in reversed(nums):
print(i)
リストの要素が逆順で一つずつ取り出されていることが分かりますね。なお、for文については「Pythonのfor文による繰り返し処理(forループ)の基本」で解説しています。
イテレータをリストに変換したい場合はlist()関数を使います。リスト関数については「Pythonのリスト作成」で解説しています。
r_nums = list(reversed(nums))
print(r_nums)
ただし、この方法では、reversed()関数とlist()関数の二度掛けになってコンピュータに余計な負担をかけてしまいます。そのため、処理速度は平均385ナノ秒と遅くなってしまいます。
%%timeit -n 100000
nums =[1, 3, 2, 5, 4]
r_nums = list(reversed(nums))
この点から、reversed()関数はあくまでもイテレータ処理を行いたい場合に使いましょう。
5. まとめ
重要な点をまとめておきます。
まず、reverse()メソッドは、要素を逆順にした新しいリストを作るのではなく、元のリストを並び替えます。要素を逆順にした新しいリストを作りたい場合は、逆順スライスを使います。
処理速度の点では、reverse()メソッドの方が逆順スライスより早いので、まず前者を使うことを検討しましょう。その方法では不可能な時に逆順スライスを使います。
それらとは異なり、reversed()関数はイテレータを生成します。これは、for文などを使ったイテレータ処理を実行したい時に使います。
list()関数とreversed()関数を重ねがけして、要素を逆順にした新しいリストを作る方法は、コンピュータへの負担や処理速度の面で不利ですので控えると良いでしょう。
コメント