Pythonで多次元リストのソート

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

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

[code lang="python"]

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

>>> list

[[2, 'd', '1100'], [7, 'z', '10'], [0, 't']]

[/code]

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

[code lang="python"]

>>> list.sort()

>>> list

[[0, 't'], [2, 'd', '1100'], [7, 'z', '10']]

[/code]

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

[code lang="python"]

>>> list.sort(lambda x, y: cmp(x[1], y[1]))

>>> list

[[2, 'd', '1100'], [0, 't'], [7, 'z', '10']]

[/code]

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

[code lang="python"]

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

[/code]

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

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

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

[code lang="python"]

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

[/code]