Pythonのリストを逆順に並び替る方法|reverse(), reversed(), スライス

Pythonのリストを逆順に並び替えるには、次の3つの方法が使えます。

  • reverse()メソッド
  • 逆順スライス
  • reversed()関数

それぞれわかりやすく解説していきたいと思います。なお、混乱のないようにお伝えしておくと、ここで解説するのは「逆順」にする方法であり「降順」にする方法ではありません。

降順ソートに関しては「Pythonでリストの要素をソートする」をご覧ください。

目次

1. reverse()メソッド

reverse()メソッドは、元のリストの要素を逆順で並び替えます。

In [1]:
nums = [1, 3, 2, 5, 4]
nums.reverse()
print(nums)
[4, 5, 2, 3, 1]

要素を逆順にした新しいリストを作るのではなく、あくまでも元のリストを並び替えます。reverse()の返り値自体はNoneですので、メソッドの実行結果そのものを出力することのないようにしましょう。

In [2]:
nums = [1, 3, 2, 5, 4]
print(nums.reverse())
None

2. 逆順スライス

スライスを使う方法でも、逆順並び替えが可能です。リストのスライスについては「Pythonのリストのスライスと分割」で解説しています。

In [1]:
nums = [1, 3, 2, 5, 4]
r_nums = nums[::-1]
print(r_nums)
[4, 5, 2, 3, 1]

3. reverse()メソッドとスライスの速度比較

reverse()メソッドとスライスでは前者の方が処理が早いです。以下は、それぞれ10万回試行した時の平均速度です。

まずreverse()メソッドでは平均114ナノ秒でした。

In [1]:
%%timeit -n 100000
nums = [1, 3, 2, 5, 4]
nums.reverse()
114 ns ± 11.7 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

次にスライスでは平均168ナノ秒でした。

In [2]:
%%timeit -n 100000
nums =[1, 3, 2, 5, 4]
r_nums = nums[::-1]
168 ns ± 16.7 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

これらの点から、リストの要素を逆順に並び替えたい場合はreverse()メソッドを基本にすると良いと言えます。

4. reversed()関数

reversed()関数は、リストの要素を逆順にしたイテレータを作成します。

最初にイテレータについて少し補足しておきます。

まず、リストは最初から値を保持しているためコンピュータのメモリを消費します。リストが大きければ大きいほど、この負担は増します。

一方でイテレータは、コードを実行する時に値を生成します。そのためコンピュータへの負担が少なくなります。

この点から、for文で要素を一つずつ取り出すような処理を行うには、特に格納されているデータ量が多い時ほど、イテレータは良い選択肢になります。

実際に見てみましょう。

以下のように、reversed()関数を実行するとイテレータ型オブジェクトが返ってきます。

In [1]:
nums = [1, 3, 2, 5, 4]
reversed(nums)
Out[1]:
<list_reverseiterator at 0x103115e10>

次のように、イテレータをfor文で回すことによって要素を一つずつ取り出すことができます。

In [2]:
for i in reversed(nums):
    print(i)
4
5
2
3
1

リストの要素が逆順で一つずつ取り出されていることが分かりますね。なお、for文については「Pythonのfor文による繰り返し処理(forループ)の基本」で解説しています。

イテレータをリストに変換したい場合はlist()関数を使います。リスト関数については「Pythonのリスト作成」で解説しています。

In [3]:
r_nums = list(reversed(nums))
print(r_nums)
[4, 5, 2, 3, 1]

ただし、この方法では、reversed()関数とlist()関数の二度掛けになってコンピュータに余計な負担をかけてしまいます。そのため、処理速度は平均385ナノ秒と遅くなってしまいます。

In [4]:
%%timeit -n 100000
nums =[1, 3, 2, 5, 4]
r_nums = list(reversed(nums))
385 ns ± 33.4 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

この点から、reversed()関数はあくまでもイテレータ処理を行いたい場合に使いましょう。

5. まとめ

重要な点をまとめておきます。

まず、reverse()メソッドは、要素を逆順にした新しいリストを作るのではなく、元のリストを並び替えます。要素を逆順にした新しいリストを作りたい場合は、逆順スライスを使います。

処理速度の点では、reverse()メソッドの方が逆順スライスより早いので、まず前者を使うことを検討しましょう。その方法では不可能な時に逆順スライスを使います。

それらとは異なり、reversed()関数はイテレータを生成します。これは、for文などを使ったイテレータ処理を実行したい時に使います。

list()関数とreversed()関数を重ねがけして、要素を逆順にした新しいリストを作る方法は、コンピュータへの負担や処理速度の面で不利ですので控えると良いでしょう。

Python初心者におすすめのプログラミングスクール

「未経験からでもPythonを学べるプログラミングスクールを探しているけど、色々ありすぎてわからない」なら、次の3つのプログラミングスクールから選んでおけば間違いはありません。

Aidemy Premium:全くの初心者ができるだけ効率よく短期間で実務的に活躍できるAI人材になることを目的とした講座。キャリアカウンセリングや転職エージェントの紹介などの転職支援も充実しており、受講者の転職成功率が高い。

AIジョブカレPythonの基本をおさえた人が、実際に機械学習やディープラーニングを活用できるようになるための講座。転職補償型があるなどキャリア支援の内容が非常に手厚く、講師の質も最高クラス。コスパ最高。Python初心者用の対策講座もある。

データミックスプログラミング経験者のビジネスマンが、更なるキャリアアップのためにデータの処理方法を学んでデータサイエンティストになるための講座。転職だけでなく起業やフリーランスとして独立する人も多い。Python初心者用の対策講座もある。

特に、あなたが以下のような目標を持っているなら、この中から選んでおけば間違いはないでしょう。

・未経験からPythonエンジニアとして就職・転職したい
・AIエンジニアやデータサイエンティストとしてキャリアアップしたい
・起業やフリーランスを視野に入れたい

理由は「Python初心者のためのおすすめプログラミングスクール3選」で解説しています。



よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

目次
閉じる