多次元リストのソート

多次元リストを手軽にソートする方法を練習してみました。


①まず、ソートする対象になるリストを作ります。

>>> list = [ [2, "d", "1100"], [7, "z", "10"], [0, "t"] ]
>>> list
[[2, 'd', '1100'], [7, 'z', '10'], [0, 't']]


②内側のリストの1個目の要素をもとにソートするだけであれば次のように簡単にソートできます。

>>> list.sort()
>>> list
[[0, 't'], [2, 'd', '1100'], [7, 'z', '10']]


③これが2番目以降の要素をもとにソートしようとするとほんのちょっとだけ面倒になります。

>>> list.sort(lambda x, y: cmp(x[1], y[1]))
>>> list
[[2, 'd', '1100'], [0, 't'], [7, 'z', '10']]


④注意点として、ソート対象にする内側のリストの中に、1つでもソート対象となる要素のない短いリストがあれば次のようにエラーになります。

>>> list.sort(lambda x, y: cmp(x[2], y[2]))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in <lambda>
IndexError: list index out of range


⑤最後に、cmp関数を使った場合、文字列としてソートしてしまします。


数値としてソートする場合は、cmpの中のオブジェクトをint関数で囲んであげる必要があります。


※2行目と5行目を見比べてください。

>>> list = [[2,"d", "1100"],[7,"z","10"],[0,"t","120"]]
>>> list.sort(lambda x, y: cmp(x[2], y[2]))
>>> list
[[7, 'z', '10'], [2, 'd', '1100'], [0, 't', '120']]
>>> list.sort(lambda x, y: cmp(int(x[2]), int(y[2])))
>>> list
[[7, 'z', '10'], [0, 't', '120'], [2, 'd', '1100']]