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

コメント