Pythonで多次元配列をソートする
2015/09/27
Pythonで多次元配列のソーティング
Pythonで多次元配列をソートする方法をメモしておきます。公式のドキュメントを読んでみると、色々と方法がありそうです。
ここでは、使いやすそうな”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]]
