schedule2019-01-28

2次元配列をソートした結果(昇順・降順・逆順) | Python

Numpyを使わなくても簡単に2次元配列のソートができます。 昇順sort()・降順sort(reverse=True)・逆順reverse()の関数を2次元配列に適用した結果を記載します。

lambda関数を使った応用も追加しました。

動作確認:Python 3.6

準備

ソートに利用する6×36 \times 3の2次元配列を用意しました。 以降はこの配列に対して実行します。

arr = [[0, 10, 6], [5, 7, 4], [9, 6, 3], [6, 3, 6], [9, 2, 9], [0, 6, 9]]

print(*arr, sep='\n')
"""
[0, 10, 6]
[5, 7, 4]
[9, 6, 3]
[6, 3, 6]
[9, 2, 9]
[0, 6, 9]
"""

出力は# => 出力 複数行の場合は"""\n出力\n"""として表現していく。

結果を見やするため、配列をアンパックして表示しています。

2次元配列をソート

sort()

arr = [[6, 10, 6], [3, 4, 9], [5, 7, 4], [9, 6, 3], [6, 3, 6], [9, 2, 9], [0, 6, 9], [7, 4, 4], [2, 1, 10], [8, 9, 3]]

arr.sort()

print(*arr, sep='\n')
"""
[0, 6, 9]
[0, 10, 6]
[5, 7, 4]
[6, 3, 6]
[9, 2, 9]
[9, 6, 3]
"""

sort()で2次元配列もソート出来ます。 特に指定もなく、1番目の要素を基準に並べている。

中身を確かめている時に気づいたが、2、3番目の要素もちゃんとソートされている。 ありがたい。

sorted()

同様にsorted()を使ってもソート出来ます。

arr = [[0, 10, 6], [5, 7, 4], [9, 6, 3], [6, 3, 6], [9, 2, 9], [0, 6, 9]]

arr = sorted(arr)

print(*arr, sep='\n')
"""
[0, 6, 9]
[0, 10, 6]
[5, 7, 4]
[6, 3, 6]
[9, 2, 9]
[9, 6, 3]
"""

降順 sort(reverse=True)

降順も同じように可能です。

arr = [[0, 10, 6], [5, 7, 4], [9, 6, 3], [6, 3, 6], [9, 2, 9], [0, 6, 9]]

arr.sort(reverse=True)

print(*arr, sep='\n')

"""
[9, 6, 3]
[9, 2, 9]
[6, 3, 6]
[5, 7, 4]
[0, 10, 6]
[0, 6, 9]
"""

1番目の要素から基準にして、降順となっています。

arr = sorted(arr, reverse=True)も同じ結果になります。

逆順 reverse()

2次元配列でもちゃんと逆順になります。

arr = [[0, 10, 6], [5, 7, 4], [9, 6, 3], [6, 3, 6], [9, 2, 9], [0, 6, 9]]

arr.reverse()

print(*arr, sep='\n')
"""
[0, 6, 9]
[9, 2, 9]
[6, 3, 6]
[9, 6, 3]
[5, 7, 4]
[0, 10, 6]
"""

arr = reversed(arr)も同様。

keyを指定してソートする

lambdaを使うと指定した要素を基準にソートすることもできる。

2番目の要素を基準に昇順

引数keyにlambdaを使って要素を割り当てる。

arr = [[0, 10, 6], [5, 7, 4], [9, 6, 3], [6, 3, 6], [9, 2, 9], [0, 6, 9]]

# 2番目の要素で昇順
arr.sort(key=lambda x: x[1]) 

print(*arr, sep='\n')
"""
[9, 2, 9]
[6, 3, 6]
[9, 6, 3]
[0, 6, 9]
[5, 7, 4]
[0, 10, 6]
"""

このとき、1、3番目の要素は比較されない。 2番目の要素が同じ数値の時は、初期の並び順に依ります。

あわせてどうぞ