Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonでリストを逆順にする方法:reverse()・reversed()・スライスを徹底解説

Pythonでは、組み込みメソッドのreverse()reversed()を使って、リストを簡単に逆順にできます。これらのメソッドは、元のリストオブジェクトの要素を反転させるための標準的な手段です。


はじめに

リストの反転(リバース)は、あらゆるプログラミング言語で頻繁に使われる基本的な操作の一つです。このチュートリアルでは、Pythonでリストを逆順にする最も効果的な方法を、サンプルコードとともに詳しく解説します。

例えば、顧客名のリストが五十音の逆順になっていて、正しい順序で表示したいとしましょう。その場合はリストを反転する必要があります。また、長いリストの末尾にあるデータを素早く確認したいときにも、ひたすらスクロールする代わりにリストを反転すれば、目的のデータにすぐアクセスできます。

Pythonのリストとスライスのおさらい

Pythonにおけるリストとは、複数の項目を格納できる配列のようなものです。文字列、ブール値(True/False)、数値、オブジェクトなど、Pythonのあらゆるデータ型を格納でき、その数に制限はありません。大量のデータを扱う場合、複数の変数を個別に宣言するよりも、一つのリストにまとめて管理した方が便利です。

リストのスライス

リストを反転するだけならスライスの知識は必須ではありませんが、理解しておくととても役立ちます。

Pythonでリストを宣言する方法は以下の通りです。

studentNames = ["Hannah", "Imogen", "Lewis", "Peter"]

ここでは変数studentNamesを宣言し、学生の名前のリストを代入しました。

リストから特定の値を取り出したい場合は、インデックス番号を使ってスライスします。リスト内の各項目には、0から始まるインデックス番号が割り当てられています。今回のリストのインデックスは以下のようになっています。

HannahImogenLewisPeter
0123

例えば、リストからImogenを取得したい場合は、次のように書きます。

studentNames = ["Hannah", "Imogen", "Lewis", "Peter"]
print(studentNames[1])

このコードでは、インデックス番号1の要素を取得しているため、出力結果はImogenになります。

さらに、開始位置と終了位置を指定することで、範囲を指定して複数の要素を一度に取得することもできます。

studentNames = ["Hannah", "Imogen", "Lewis", "Peter"]
print(studentNames[1:3])

出力結果:

["Imogen", "Lewis"]

スライスの基本がわかったところで、いよいよPythonでリストを反転する具体的な方法を見ていきましょう。

Pythonでリストを反転する3つの方法

Pythonでリストを反転する主な方法は、次の3つです。

  • スライスを使った反転
  • reverse()メソッドを使った反転
  • reversed()関数を使った反転

方法1:スライスを使って反転する

1つ目は、スライスのテクニックを使ってリストを反転する方法です。構文は次の通りです。

studentNames = ["Hannah", "Imogen", "Lewis", "Peter"]
print(studentNames[::-1])

出力結果:

["Peter", "Lewis", "Imogen", "Hannah"]

[::-1]というスライス指定により、リスト全体が逆順にコピーされます。これは非常によく使われる手法ですが、リストのコピーが新しく作成されるためメモリを消費する点には注意が必要です。また、他の方法に比べるとやや上級者向けの書き方と言えるでしょう。

方法2:reverse()メソッドを使って反転する

2つ目は、組み込みメソッドのreverse()を使う方法です。reverse()は、リストオブジェクトの内容を「in-place(その場で)」反転します。つまり、新しいリストを作成するのではなく、元のリスト自体を直接変更します。

次のコードは、reverse()の実際の使用例です。

studentNames = ["Hannah", "Imogen", "Lewis", "Peter"]
studentNames.reverse()

print(studentNames)

出力結果:

["Peter", "Lewis", "Imogen", "Hannah"]

注意すべき点として、reverse()メソッド自体の戻り値はNoneです。そのため、反転後のリストを確認したい場合は、上記のように改めてprintで出力する必要があります。この方法は新しいリストを作らないためメモリ効率が良く、構文もシンプルで直感的に理解しやすいのが大きなメリットです。

方法3:reversed()関数を使って反転する

3つ目は、組み込み関数のreversed()を使う方法です。reversed()は逆順イテレータ(reverse iterator)を生成し、元のリストを一切変更せずに、要素を逆順に取り出すことができます。

次のコードは、reversed()関数の使用例です。

studentNames = ["Hannah", "Imogen", "Lewis", "Peter"]
for i in reversed(studentNames):
    print(i)

出力結果:

"Peter"
"Lewis"
"Imogen"
"Hannah"

もし反転済みのリストのコピーを実際に作成したい場合は、list()と組み合わせて次のように書きます。

studentNames = ["Hannah", "Imogen", "Lewis", "Peter"]
reversed_list = list(reversed(studentNames))
print(reversed_list)

出力結果:

["Peter", "Lewis", "Imogen", "Hannah"]

この方法も非常にシンプルで、コードから何が行われているのかが明確に読み取れます。元のリストのすべての値を含む、逆順の新しいリストが生成されます。

まとめ

このチュートリアルでは、Pythonでリストを反転するさまざまな方法を解説しました。まず、文字列やオブジェクトなどを格納できるリストの基本とインデックス番号についておさらいし、そのうえで、リストを反転する3つの方法を紹介しました。それぞれの特徴を整理すると、以下の表のようになります。

方法元のリストへの影響特徴
スライス [::-1]変更されないコピーが作成されるためメモリを消費
reverse()変更されるin-placeで省メモリ。戻り値はNone
reversed()変更されないイテレータを返す。list()で新リスト化可能

実務で使うのはどれか1つの方法だけで十分ですが、3つすべてを知っておくと、他人が書いたコードを読む際や、状況に応じて最適な手法を選ぶ際に必ず役立つでしょう。

  1. Pythonでタプルのリスト内の各タプルを反転する方法

    タプルのリスト内の各タプルを反転させたい場合、負のステップスライシング([::-1])を使うと簡単に実現できます。Pythonのリストは、整数や浮動小数点数、文字列など、さまざまなデータ型の値(異種の値)をまとめて格納できる便利なデータ構造です。「タプルのリスト」とは、リストの中に複数のタプルが含まれている形式のことを指します。負のスライシングでは、通常の正のインデックスではなく、負の数を使って要素にアクセスします。ステップに「-1」を指定することで、要素を末尾から先頭へと逆順に取り出すことができます。以下に具体的な実装例を示します。サンプルコードdef reverse_tuple(my_tu

  2. Pythonで連結リストをk個ずつのグループに分けて反転させる方法

    片方向連結リストと整数 k が与えられたとき、リストを先頭から k 個ずつの連続するグループに分割し、それぞれのグループ内でノードの並びを反転させる問題を考えます。たとえば、入力が List = [1,2,3,4,5,6,7,8,9,10]、k = 3 の場合、出力は [3, 2, 1, 6, 5, 4, 9, 8, 7, 10] となります。3個ごとに区切られた各グループが逆順になっており、余った要素(この例では最後の 10)は元の順序のまま保持される点に注目してください。アルゴリズムの流れこの問題を解くには、次の手順に従います。値 0 を持つダミーノード tmp を作成し、tmp の次に元