Pythonでリストの並び順を反対(逆順)にしたい場合、主に3つのアプローチがあります。
それぞれ「新しいリストを作成するか」「元のリストを書き換えるか」「イテレータとして扱うか」という点で挙動が異なるため、用途に合わせて使い分けることが重要です。
ここでは、Webブラウザの閲覧履歴データを例に、それぞれの実装方法と特徴を解説します。
目次
1. スライス構文 [::-1] を使用する
最も簡潔で、Pythonらしい(Pythonicな)記述方法です。元のリストは変更せず、逆順にコピーされた新しいリストを作成します。
# 閲覧履歴(古い順に格納されていると仮定)
browsing_history = ["Top Page", "Search Results", "Article A", "Article B"]
# スライス構文 [start:stop:step] で step に -1 を指定
# これにより、末尾から先頭に向かって要素を取得した新しいリストが生成されます
recent_history = browsing_history[::-1]
print(f"Original: {browsing_history}")
print(f"Reversed: {recent_history}")
実行結果
Original: ['Top Page', 'Search Results', 'Article A', 'Article B']
Reversed: ['Article B', 'Article A', 'Search Results', 'Top Page']
2. 組み込み関数 reversed() を使用する
reversed() 関数は、逆順にアクセスするためのイテレータを返します。
巨大なリストを扱う際、メモリ上に新しい逆順リストを即座に生成したくない場合に有効です。リストとして実体化させたい場合は list() で変換します。
browsing_history = ["Top Page", "Search Results", "Article A", "Article B"]
# reversed() はイテレータを返すため、for文などで回すか list() で変換して使います
reverse_iterator = reversed(browsing_history)
# ここでリストに変換して実体化
recent_history_v2 = list(reverse_iterator)
print(f"Reversed by function: {recent_history_v2}")
3. リストの reverse() メソッドを使用する
リストオブジェクト自体が持つ reverse() メソッドを使用すると、元のリスト自体を逆順に書き換えます(破壊的変更)。
新しいリストを作成しないためメモリ効率が良いですが、元の順序情報は失われます。戻り値は None であることに注意してください。
browsing_history = ["Top Page", "Search Results", "Article A", "Article B"]
# リスト自体を反転させる(戻り値はない)
browsing_history.reverse()
print(f"Destructively Reversed: {browsing_history}")
まとめ
| 方法 | 構文 | 特徴 | 元のリスト |
| スライス | l[::-1] | 最も簡潔。新しいリストを作る。 | 変更なし |
| 関数 | reversed(l) | イテレータを返す。メモリ効率が良い。 | 変更なし |
| メソッド | l.reverse() | リスト自体を書き換える。 | 変更される |
基本的にはスライス [::-1] を使用し、メモリ効率を重視する場合や元のリストが不要な場合には他の方法を検討すると良いでしょう。
