Pythonでリストを逆順にループ処理する2つの方法:reversed()関数とスライス

Pythonの for 文は、デフォルトではリストの先頭(インデックス0)から末尾に向かって要素を取り出します。しかし、時系列データを「新しい順(末尾から)」に処理したい場合や、ランキングを「下位から」表示したい場合など、逆順でループ処理を行いたい場面があります。

Pythonには、リストを逆順に処理するための主な方法が2つあります。

  1. reversed() 関数を使用する(推奨)
  2. スライス構文 [::-1] を使用する

この記事では、それぞれの書き方と特徴、そしてメモリ効率の観点からの使い分けについて解説します。

目次

1. reversed() 関数を使用する方法(推奨)

最も一般的で推奨される方法は、組み込み関数の reversed() を使用することです。

この関数は、リストなどのシーケンスを受け取り、要素を逆順に取り出すための「イテレータ」を返します。

構文:

for 変数 in reversed(リスト):
    # 処理

使用例: 操作履歴(ログ)を、新しいもの(リストの末尾)から順に表示するプログラムです。

# ユーザーの操作履歴(左が古い、右が新しい)
operation_log = ["ログイン", "商品検索", "カートに追加", "購入確定"]

print("--- 操作履歴 (新しい順) ---")

# reversed() を使って末尾から順に処理
for action in reversed(operation_log):
    print(f"アクション: {action}")

実行結果:

--- 操作履歴 (新しい順) ---
アクション: 購入確定
アクション: カートに追加
アクション: 商品検索
アクション: ログイン

メリット:

  • メモリ効率が良い: reversed() はリストのコピーを作成せず、要素を逆順に取り出す仕組み(イテレータ)だけを提供するため、巨大なリストを扱う場合でもメモリ消費が少なく済みます。
  • 可読性が高い: 関数名が reversed(逆にする)であるため、コードの意図が一目で伝わります。

2. スライス構文 [::-1] を使用する方法

もう一つの方法は、リストのスライス構文 [start:stop:step]step-1 を指定するテクニックです。

構文:

for 変数 in リスト[::-1]:
    # 処理

[::-1] は、リストの末尾から先頭までを1つずつ取り出した**新しいリスト(コピー)**を作成します。

使用例: カウントダウンの数値を逆順に表示する例です。

# カウント用の数値リスト
count_numbers = [1, 2, 3, 4, 5]

print("--- カウントダウン ---")

# スライス [::-1] で逆順のリストを作成してループ
for num in count_numbers[::-1]:
    print(f"Count: {num}")

実行結果:

--- カウントダウン ---
Count: 5
Count: 4
Count: 3
Count: 2
Count: 1

メリット:

  • 記述が短い: 簡潔に書くことができます。

デメリット:

  • メモリ効率が悪い: 元のリストと同じ中身を持つ新しいリストを複製してしまうため、リストの要素数が数万、数百万と大きい場合にはメモリを大量に消費します。

まとめ:どちらを使うべきか

基本的には reversed() 関数 の使用を推奨します。

  • reversed(list): メモリ効率が良く、コードの意味も明確です。単にループで逆順に処理したいだけであれば、こちらが最適です。
  • list[::-1]: 「逆順にした新しいリストそのもの」が必要な場合には便利ですが、単なるループ処理においてはメモリの無駄遣いになる可能性があります。
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次