Pythonで多次元配列をソートする

Pythonで多次元配列のソーティング

Pythonで多次元配列をソートする方法をメモしておきます。公式のドキュメントを読んでみると、色々と方法がありそうです。

ソート HOW TO — Python 3.4.3 ドキュメント

ここでは、使いやすそうな”sort()”メソッドと”itemgetter”の組み合わせで多次元配列をソートしてみます。(”lambda”式を使うとコードが見にくい気がして好みじゃないのです。)

sort()メソッドとitemgetterを使った多次元配列のソーティング

まずはおまじないを唱えて”Operator”クラスからitemgetterをインポートします。

from operator import itemgetter

今回は、以下の配列をソーティングします。3個の要素を持った配列を6個並べています。

girls = [
['Tabe',1989,158],['Goriki',1992,162],['Becky',1984,157],
['Tsuchiya',1984,168],['Karina',1984,165],['Nishino',1989,158]
]

“sort()”メソッドは、”list.sort()”として使うのは良いですね。ここにキーとして”itemgetter”を渡します。”itemgetter”の引数は、キーとなる配列の要素です。

girls.sort(key=itemgetter(1))
print girls

実行結果は以下のとおりです。キーとなった2番目の要素でソートされているのがわかります。キー値が同じものは、元の配列の順序どおりになっているっぽいですね。

[['Becky', 1984, 157], ['Tsuchiya', 1984, 168], ['Karina', 1984, 165], ['Tabe', 1989, 158], ['Nishino', 1989, 158], ['Goriki', 1992, 162]]

“itemgetter”の引数に複数の値を渡せば、多重キーでソートしてくれます。

girls.sort(key=itemgetter(1,2))
print girls

実行結果は以下のとおりです。1番目のキーでソートした後、2番目のキーでソートされています。

[['Becky', 1984, 157], ['Karina', 1984, 165], ['Tsuchiya', 1984, 168], ['Tabe', 1989, 158], ['Nishino', 1989, 158], ['Goriki', 1992, 162]]

試しに、キーとなる値の順序を入れ替えてみます。

girls.sort(key=itemgetter(2,1))
print girls

実行結果は以下のとおりです。3番目の要素を先にソートしています。

[['Becky', 1984, 157], ['Tabe', 1989, 158], ['Nishino', 1989, 158], ['Goriki', 1992, 162], ['Karina', 1984, 165], ['Tsuchiya', 1984, 168]]

降順でソートするにはどうすれば良いでしょうか? これには、”sort()”メソッドの引数として”reverse=True”を渡してあげれば良いです。

girls.sort(key=itemgetter(1,2),reverse=True)
print girls

実行結果は以下のとおりです。どのキーについても降順でソートされています。ただし、キー値が同じものは元の配列の順序どおりにソートされています。

[['Goriki', 1992, 162], ['Tabe', 1989, 158], ['Nishino', 1989, 158], ['Tsuchiya', 1984, 168], ['Karina', 1984, 165], ['Becky', 1984, 157]]

シェアしてもらえるとうれしいです。゚(´っωc`)゚。