Pythonで二次元配列をsortする

社会人になってからしばらくやっていなかった競技プログラミングを細々と再開してたりする。

主にAizu Online JudgeAtCoderをやってたりしてて、言語は全部Pythonでやってる

理由はいくつかあって、

  • 書いてて楽しい

  • リスト周りの関数が強い

    • 少なくとも自分がまともに使える言語の中では一番使いやすい
    • リスト内包表記最高です(^q^)
  • キモいコード書いて悦に入れる

    • print(sum(list(map(int, input().split()))))みたいな
    • Zen of Pytonなんてなかった

てな感じ。

で、リハビリがてら簡単な問題をやっていて忘れてたことをメモ。

二次元配列をsortする

  • 環境

    • Python3.4.1

1次元配列のsortはsort()もしくはsorted()を素直に使えば良い。

前者は配列が持つ関数で返り値が無し。

後者は配列の内容は変わらないが返り値が来る。

以下のとおり

a = [2, 3, 1]
              
              print(sorted(a)) # [1, 2, 3]
              
              print(a)         # [2, 3, 1]
              
              a.sort()
              
              print(a) # [1, 2, 3]
              

まぁなんてことないですよね。

じゃあ二次元配列をsortするとどうなるか。

これは、要素の配列のどれをkeyとしてsortするのかで結果が変わってきます。

まずは素直にsortする。

a = [ [2, 3, 1], [1, 3, 4], [3, 4, 4] ]
              
              print(sorted(a)) # [ [1, 3, 4], [2, 3, 1], [3, 4, 4] ]
              

素直にsortすると各配列の先頭要素をkeyとしてsortします。

では各配列の2番めの値をkeyとしたいときはどうすればよいか。

方法としてはsorted()の引数にkeyの値をしていします。

そしてその方法として以下の2つがあります。

  • keyに関数を指定する

  • 標準ライブラリであるoperatoritemgetterを使用

順番に紹介します。

keyに関数を指定する

例えば、以下の様な書き方をすると各要素の2番目の値をkeyとしてsortを行います.

a = [ [1, 2, 3], [1, 1, 4], [4, 5, 2] ]
              
              prtint(sorted(a, key=lambda x: x[1])) # [ [1, 1, 4], [1, 2, 3], [4, 5, 2] ]
              

ここでは無名関数を用いることによって各要素の2番目のインデックスをkeyとして指定しています。

ここにstr.lower等を指定することで、小文字優先のsortにすることも可能だったりします

operatorモジュールを使用する

上に書いたようなsortはしょっちゅうやるよね〜いちいち指定すんのだるいよね〜

ってことでドキュメントではitemgetter()が推奨されています。

こちらの方が高速にアクセスできるようなので何か特別な理由がなければこれを使うといいと想います(╹◡╹)

以下の一行でまずはimport

from operator import itemgetter
              

そして使う

a = [ [1, 2, 3], [1, 1, 4], [4, 5, 2] ]
              
              print(sorted(a, key=itemgetter(1))) # [ [1, 1, 4], [1, 2, 3], [4, 5, 2] ]
              

ね、簡単でしょ?

ってわけで引き続きこつこつ問題を解いていきたいと思います。

以上。解散!

comments powered by Disqus