2次元リスト

2次元リストの扱い方

要素の取得

対象リスト

list_a = [[0, 1, 2, 3],
          [10, 11, 12, 13],
          [20, 21, 22, 23],
          [30, 31, 32, 33]]

行を取り出す

list_b = list_a[0]
list_b

[0, 1, 2, 3]

列を取り出す

list_b = [x[1] for x in list_a]
list_b

[1, 11, 21, 31]

空リストの作成

内包表記で作る

list_c = [[0] * 4 for x in range(4)]
list_c

[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]

[[0] * 4] * 4はNG

list_c = [[0] * 4] * 4
list_c

[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]

list_c[0][0] = 1
list_c

[[1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0]]

行と列の入替

引数に*をつけてリストをzipに渡すとできる

list_d = [[1, 2, 3],[4, 5, 6],[7, 8, 9]]
list_e = [list(x) for x in zip(*list_d)]
list_e

[[1, 4, 7], [2, 5, 8], [3, 6, 9]]

# どういうこと?
print(*list_d)

[1, 2, 3] [4, 5, 6] [7, 8, 9]

print(list(zip(*list_d)))

[(1, 4, 7), (2, 5, 8), (3, 6, 9)]

ソート

2次元リストを引数にsortedを使うと各リストのはじめの要素でソートされる

list_f = [[5, 3, 7], [1, 8, 6], [9, 4, 2]]
print(sorted(list_f))

[[1, 8, 6], [5, 3, 7], [9, 4, 2]]

行でソートする -> 各リストをソートする

list_g = [sorted(x) for x in list_f]
list_g

[[3, 5, 7], [1, 6, 8], [2, 4, 9]]

列でソートするには、行列の入替をしてソート、ソート結果をまた行列を入れ替えて返せばよい

list_g = [list(x) for x in zip(*[sorted(y) for y in zip(*list_f)])]
list_g

[[1, 3, 2], [5, 4, 6], [9, 8, 7]]

合計を求める

各リストを合計してさらにそれを合計する

total = sum(sum(x) for x in list_g)
total

45

最大値を求める

max(max(list))はうまくいかない

list_h = [[0, 0, 0], [0, 2, 0], [0, 0, 3]]
print(max(max(list_h)))

2

これも、いちど各リストのmaxをとってさらにmax

print(max([max(x) for x in list_h]))

3

カウント

同様にゼロのカウントをしたいとき

print(list_h.count(0))

0

解決策は同じ

print(sum[x.count(0) for x in list_h])

7
Last modified 2020.10.13