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]