茨城県つくば市でモバイルアプリ(iPhone、Android)のプログラミングをする日記です。あとWordPress、Raspberry Pi、Arduinoなど。

モバイルプログラミング@つくば

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

投稿日:2015年7月31日 更新日:

本記事では、Python 2.7を使っています。
執筆から時間が経っており、情報が古い可能性があります。

こんにちは、okuzawatsです。
ソートはそーっとしています。

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]]

これで、Pythonを使って多次元配列をソートできるようになりました。

-Python

Copyright© モバイルプログラミング@つくば , 2017 AllRights Reserved Powered by AFFINGER4.