sort・sortedを使用して昇順・降順でソートしたい
アルファベット順に並び替えるにはどうすればいいの?
多次元のリストを並び替えるにはどうすればいいの?
システムやアプリケーションの開発において、取得したリストなどのデータをソート(並び替え)する必要性が発生することがよくあります。Pythonではソート(並べ替え)を行うときに便利な「sortメソッド」「sorted関数」が用意されています。
これらを使うことで簡単に昇順・降順の並べ替えを行うことができます。
ここでは、Pythonでソートする方法について以下の内容で解説していきます。
- そもそもソートとは
- sort・sortedの使い方
- ソートの応用的な使い方
Pythonのソート処理についてわかりやすく解説していますので、ぜひ参考にしてください。
なお、Pythonの記事については、こちらにまとめています。
そもそもソートとは
ソートとは、ある基準に従って要素を並べ替える操作のことです。
例えば、次のようなリストがあったとします。
ls = [1,5,9,3,7]
これを昇順(小さいものが前、大きいものが後ろ)にソートすると、
ls = [1,3,5,7,9]
になります。
ソートにはさまざまなアルゴリズムがありますが、予め用意されているメソッドや関数を使えば何も考えずにソートを実行することが出来ます。
リストをソートする方法
それでは早速リストをソートしてみましょう。リストとは、複数のオブジェクトを一つにまとめた型でしたね。
リストの使い方については、以下の記事で解説しています。チェックしてみてください。
sortメソッド:リストの内容をソートする
昇順でソート
まずはsortメソッドで昇順にソートをしてみましょう。sortメソッドはリスト型のメソッドになります。
こちらのコードをご覧ください。
ls = [1,5,3,7,9,4,2,8,6] ls.sort() print(ls)
実行結果
[1, 2, 3, 4, 5, 6, 7, 8, 9]
このようにリストをソートすることが出来ましたね。
降順でソート
降順(大きいものが前、小さいものが後ろ)にソートする場合は、sortメソッドの引数に「reverse = True」と書いてみましょう。
リスト.sort(reverse = True)
以下は降順でソートするサンプルです。
ls = [1,5,3,7,9,4,2,8,6] ls.sort(reverse = True) print(ls)
実行結果
[9, 8, 7, 6, 5, 4, 3, 2, 1]
sortメソッドは破壊的(sortメソッドを使ったオブジェクトの中身が変わってしまうこと)な作業になるので、一度ソートしたリストは中身が変わってしまいます。
では次に、もとのリストを残したままソートをする方法について見ていきましょう。
sorted関数:ソートしてリストを作成
sorted関数を使えばもとのリストを残したまま(破壊的でない)ソートをすることが出来ます。
こちらのコードをご覧ください。
ls = [1,5,3,7,9,4,2,8,6] std = sorted(ls) print(std) print(ls)
実行結果
[1, 2, 3, 4, 5, 6, 7, 8, 9] # std変数 [1, 5, 3, 7, 9, 4, 2, 8, 6] # ls変数
このようにもとのリストを残したまま昇順にソートをすることが出来ましたね。
sorted関数もsortメソッドと同じように引数に「reverse = True」とすれば降順のソートにすることも出来ます。
ls = [1,5,3,7,9,4,2,8,6] std = sorted(ls, reverse=True) print(std)
実行結果
[9, 8, 7, 6, 5, 4, 3, 2, 1]
sortメソッドとsorted関数の違いはもとのリストを残したいか消しても良いかということです。
目的によって使い分けましょう。
アルファベット順にソートする方法
次は文字列をソートしてみましょう。
例として、アルファベットをソートしてみます。
ls = ['b','a','c','B','C','A'] std = sorted(ls) print(std)
実行結果
['A', 'B', 'C', 'a', 'b', 'c']
このように、sorted関数を使えばしっかりとアルファベットでもソートされることがわかりましたね。また、大文字と小文字が入り混じっている場合は、大文字の方が先に来ることに気をつけましょう。
これはどういうことかというと、小文字より大文字の方が文字コードで先に来ることを示します。これはPythonのコンソールを使えば確認をすることが出来ます。
print('a' > 'A') print('a' < 'A')
実行結果
True # a > A False # a < A
多次元のリストをソートする方法
ステップアップして多次元のリスト(リストの中にリストが入っているようなリスト)をソートしてみましょう。
こちらのコードをご覧ください。
ls = [[1,2],[7,6],[3,2],[4,5]] std = sorted(ls) print(std)
実行結果
[[1, 2], [3, 2], [4, 5], [7, 6]]
特に何も指定しないでソートをすると、昇順で各配列の1番目(インデックス0)の順番になっています。
各配列の2番目(インデックス1)でソートをするには、sorted関数のkeyに関数を指定します。
こちらのコードをご覧ください。
ls = [[1,5],[7,1],[3,2],[4,9]] std = sorted(ls, key=lambda x: x[1]) print(std)
実行結果
[[7, 1], [3, 2], [1, 5], [4, 9]]
keyキーワードにラムダ式と呼ばれる関数を渡して、各配列の2番目(インデックス1)を指定しています。
ラムダ式についてはこちらの記事をご覧ください。
このkeyという引数は、sorted関数でソートするときの基準を変えることができるオプションです。
ここに「sorted関数の第一引数として与えられるリストなどの要素を一つ引数として受け取って、何かしらの値を返す関数」を渡して上げることでソートの基準を変えることができるんですね。
まとめ
ここではリストをソートする方法について以下の内容を解説しました。
- ソートとは
- sortメソッド、sorted関数でソートをする方法
- reverseメソッド、reversed関数の使い方
- アルファベット順にソートをする方法
- 多次元のリストをソートする方法
昇順のソートはわかっていても、降順はわからなかったり、アルファベットの扱いがあやふやだった人も多いのではないでしょうか。最後に紹介したラムダ式を使うソート方法は覚えておいて損がありません。
もしリストのソートについて忘れてしまったら、ぜひこの記事を読み返してみてください!