python3 基準となる列を指定して2次元リストをソート

2次元リストの2列目や3列目等の特定の列を基準にしてソートをする方法を説明します。

2次元リストのソート

sorted関数のkeyに、1つの引数を取る関数(ラムダ式も可)を指定することで、その戻り値を基準にソートできます。
ここでは2次元リストの2列目を基準にソートするので、2列を返すラムダ式をkeyとして渡します。

#2次元リストをソート
ListInList = [[1, 3], [2, 1], [3, 2]]
ListInList = sorted(ListInList, key = lambda x:x[1])
print(ListInList)
"""出力
[[2, 1], [3, 2], [1, 3]]
"""

#タプルのリストをソート
tulpleInList = [(1, 3), (2, 1), (3, 2)]
tulpleInList = sorted(tulpleInList, key = lambda x:x[1])
print(tulpleInList)
"""出力
[(2, 1), (3, 2), (1, 3)]
"""
  • 2次元リストを生成します。
  • key = lambda x:x[1]は、ListInListの各要素([1, 3], [2, 1]等)の2列目(3, 1等)(*1)の要素を返すラムダ式を指定しています。
  • タプルのリストについても同様の方法でソートできます。

(*1)Pythonのリストはインデックスの開始が0からなので、インデックス0が1列目、インデックス1が2列目と対応しています。

使用例:2次元リストの2列目を基準に数値順でソート

1列目が文字列、2列目が数字(string型)の2次元リストを2列目を基準にソートする場合、2列目がint型ではないので辞書順でソートされてしまいます。数値順でソートするためには、2列目をint型に変換したうえでソートする必要があります。
下記、2次元リストの2列目を基準に数値順でソートするコードです。

n = int(input())
st = []
st = [tuple(input().split()) for _ in range(n)]

#辞書順でソートされます。
st1 = sorted(st)
print(*st1, sep="\n")

#数値順でソートされます。
st2= sorted(st, key = lambda x: int(x[1]))
print(*st2, sep="\n")

"""入力
3
AAA 11
BBB 2
CCC 3
"""
"""出力
#st1
('AAA', '11')
('BBB', '2')
('CCC', '3')

#st2
('BBB', '2')
('CCC', '3')
('AAA', '11')
"""

・print(*st, sep=”\n”)については、「リストの各要素を複数行に出力」をご確認ください。

おまけ:keyは特定の列を返すラムダ式以外も指定できます

下記では、ListInListの各要素の2列目の値の1桁目を基にソートしています。

ListInList = [[1, 13], [2, 31], [3, 22]]

ListInList = sorted(ListInList, key = lambda x:x[1]%10)
print(ListInList)
"""出力
[[2, 31], [3, 22], [1, 13]]
"""

参考

組み込み関数 — Python 3.9.4 ドキュメント sorted

ソート HOW TO — Python 3.9.4 ドキュメント Key関数

コメント

タイトルとURLをコピーしました