Pythonでリストの要素を逆順にするには、いくつかの方法があります。それぞれの方法には特徴があり、状況に応じて使い分けることが重要です。本記事では、代表的な4つの方法を紹介し、それぞれの特徴と注意点を解説します。
紹介する方法と比較
この記事ではストの要素を逆順にする方法として、「reverse()メソッド」「ライス」「sorted()関数」「reversed()関数」の4つを取り上げます。各方法の概要と比較は以下の表の通りです。
| 方法 | 元のリスト | 新しいリスト | メモリ効率 | 速度 | 柔軟性 | 記述の簡潔さ |
|---|---|---|---|---|---|---|
reverse() |
変更 | 作成しない | ◎ | ◎ | △ | ◎ |
| スライス | 変更しない | 作成する | △ | ○ | △ | ○ |
sorted() |
変更しない | 作成する | △ | △ | ○ | ○ |
reversed() |
変更しない | 作成しない | ◎ | ○ | ○ | ○ |
元のリストを変更したい場合はreverse() メソッド、それ以外はスライス、sorted()、reversed() を利用します。単純な処理ではスライスを用い、メモリ効率を重視する場合は、reversed() 関数を検討します。ここから、それぞれの方法の詳細と具体的な実装方法を紹介していきます。
reverse() メソッド
reverse() メソッドは、リストオブジェクトが持つメソッドで、元のリストの要素を直接逆順に並び替えます。元のリストが変更される破壊的変更なため、元の順序を保持したい場合は、事前にリストをコピーする必要があります。
使用例
fruits = ["apple", "banana", "orange", "grape"] fruits.reverse() # fruitsリストの要素が直接逆順になる print(fruits)
出力
['grape', 'orange', 'banana', 'apple']
スライス
スライスは、リストの一部を取り出す機能ですが、[::-1] という特殊なスライスを使うと、元のリストを変更せずに、逆順にした新しいリストを作成できます。新しいリストが作成される(非破壊的変更の)ため、reverse() メソッドに比べるとメモリを消費します。
使用例
fruits = ["apple", "banana", "orange", "grape"] reversed_fruits = fruits[::-1] # fruitsの逆順の新しいリストを作成 print(fruits) # 元のリスト print(reversed_fruits) # 逆順になった新しいリスト
出力
['apple', 'banana', 'orange', 'grape'] ['grape', 'orange', 'banana', 'apple']
sorted() 関数
sorted() 関数は、リストの要素をソートした新しいリストを返します。reverse=True 引数を指定することで、降順(逆順)にソートされたリストを作成できます。新しくリストを作成しますので、非破壊的変更で元のリストは変更されません。sorted() は、単純な逆順だけでなく、ソートを行うため、[::-1] スライスや reverse() メソッドに比べて処理速度が遅くなる可能性があります。要素が文字列の場合、辞書順で比較されることに注意する必要があります。
使用例
fruits = ["apple", "banana", "orange", "grape"] reversed_fruits = sorted(fruits, reverse=True) # 降順でソートした新しいリスト print(fruits) # 元のリスト print(reversed_fruits) # 逆順になった新しいリスト
出力
['apple', 'banana', 'orange', 'grape'] ['grape', 'orange', 'banana', 'apple']
補足
厳密にはsorted関数はリストを逆順にしているわけではなく、逆順(降順)にソートしています。数値のリストなど単純な比較ができる要素のリストを扱う場合は、[::-1]スライスと結果は変わりません。
reversed() 関数
reversed() 関数は、リストの要素を逆順にアクセスできるイテレータを返します。イテレータが返されますので、リストとして扱うにはlist()関数でリストに変換する必要があります。元のリストは変更されません。イテレータが要素にアクセスされるまで、実際の逆順処理は行われない遅延評価という動きをします。そのため、この方法はメモリ効率が良く、大きなリストを扱う場合に、メモリ使用量を抑えることができます。
使用例
fruits = ["apple", "banana", "orange", "grape"] reversed_iterator = reversed(fruits) # 逆順のイテレータを取得 print(fruits) print(reversed_iterator) # イテレータから要素を順に取り出す for fruit in reversed_iterator: print(fruit) # リストに変換する場合 reversed_list = list(reversed_iterator) print(reversed_list) # 空のリストが出力される。理由はreversed_iteratorがイテレータであり、 # すでに要素を反復処理で使い果たしてしまっているため。 # もう一度reversed_list = list(reversed(fruits))とすれば、 # 逆順のリストが出力される。
出力
['apple', 'banana', 'orange', 'grape'] <list_reverseiterator object at 0x...> grape orange banana apple []
補足
イテレータは一度要素を反復処理すると使い果たされるため、再度逆順のリストが必要な場合はreversed()を再度呼び出す必要があります。
[PR]