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]]