2次元リスト
要素の取得
対象リスト
1list_a = [[0, 1, 2, 3],
2 [10, 11, 12, 13],
3 [20, 21, 22, 23],
4 [30, 31, 32, 33]]
行を取り出す
1list_b = list_a[0]
2list_b
3
4[0, 1, 2, 3]
列を取り出す
1list_b = [x[1] for x in list_a]
2list_b
3
4[1, 11, 21, 31]
空リストの作成
内包表記で作る
1list_c = [[0] * 4 for x in range(4)]
2list_c
3
4[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
[[0] * 4] * 4
は NG
1list_c = [[0] * 4] * 4
2list_c
3
4[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
5
6list_c[0][0] = 1
7list_c
8
9[[1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0]]
行と列の入替
引数に*
をつけてリストをzip
に渡すとできる
1list_d = [[1, 2, 3],[4, 5, 6],[7, 8, 9]]
2list_e = [list(x) for x in zip(*list_d)]
3list_e
4
5[[1, 4, 7], [2, 5, 8], [3, 6, 9]]
6
7# どういうこと?
8print(*list_d)
9
10[1, 2, 3] [4, 5, 6] [7, 8, 9]
11
12print(list(zip(*list_d)))
13
14[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
ソート
2 次元リストを引数にsorted
を使うと各リストのはじめの要素でソートされる
1list_f = [[5, 3, 7], [1, 8, 6], [9, 4, 2]]
2print(sorted(list_f))
3
4[[1, 8, 6], [5, 3, 7], [9, 4, 2]]
行でソートする -> 各リストをソートする
1list_g = [sorted(x) for x in list_f]
2list_g
3
4[[3, 5, 7], [1, 6, 8], [2, 4, 9]]
列でソートするには、行列の入替をしてソート、ソート結果をまた行列を入れ替えて返せばよい
1list_g = [list(x) for x in zip(*[sorted(y) for y in zip(*list_f)])]
2list_g
3
4[[1, 3, 2], [5, 4, 6], [9, 8, 7]]
合計を求める
各リストを合計してさらにそれを合計する
1total = sum(sum(x) for x in list_g)
2total
3
445
最大値を求める
max(max(list))
はうまくいかない
1list_h = [[0, 0, 0], [0, 2, 0], [0, 0, 3]]
2print(max(max(list_h)))
3
42
これも、いちど各リストのmax
をとってさらにmax
1print(max([max(x) for x in list_h]))
2
33
カウント
同様にゼロのカウントをしたいとき
1print(list_h.count(0))
2
30
解決策は同じ
1print(sum[x.count(0) for x in list_h])
2
37
リスト内包表記と二次元リスト
リスト内包表記を使って二次元リストを展開
1print([y for x in [[1, 2], [3, 4], [5, 6]] for y in x])
2
3[1, 2, 3, 4, 5, 6]
リストの構造を保ったまま式を適用
1print([[x * 2 for x in y] for y in [[1, 2], [3, 4], [5, 6]]])
2
3[[2, 4], [6, 8], [10, 12]]