List of list 實作二維陣列

List 中可以擺任何型態的資料

a = [1, 3.1416, 'Python', 'x']

Python 用 list of list 來實作二維陣列,也就是 a 是一個有 m 個元素的 List,
而 a 的每個元素都是一個有 n 個元素的 list。如果執行下面的程式:

先注意 list 乘法是把 n 相鄰的 list 裡面的資料給重複。
也就是 [[[0]]]
3 其實是重複三次 list 的內容 [[0]],變成 [[[0]], [[0]], [[0]]]

a = [[0]*4 for i in range(3)]
=>a = [[0,0,0,0] for i in range(3)]
=>a = [[0,0,0,0],[0,0,0,0],[0,0,0,0]]

b = [[0]*4]*3
=>b = [[0,0,0,0]]*3
=>b = [[0,0,0,0],[0,0,0,0],[0,0,0,0]]

但 b 其實是錯的,因為你以為建立的是

[
 ['+','+','+'],
 ['+','+','+'],
 ['+','+','+']
]

但實際上建立的是

      ┌──────────────┐
v ───►│ ['+','+','+']│◄──┐
      └──────────────┘   │
            ▲            │
            │            │
            └────────────┘

也就是 n 個元素都指向同一個 list


建一個九九乘法表

t = [[0] * 10 for i in range(10)]
for i in range(1, 10):
    for j in range(1, 10):
        t[i][j] = i * j

for i in t:
    for j in i:
        print(j,end=" ")
    print()

output:
0 0 0 0 0 0 0 0 0 0 
0 1 2 3 4 5 6 7 8 9 
0 2 4 6 8 10 12 14 16 18 
0 3 6 9 12 15 18 21 24 27 
0 4 8 12 16 20 24 28 32 36 
0 5 10 15 20 25 30 35 40 45 
0 6 12 18 24 30 36 42 48 54 
0 7 14 21 28 35 42 49 56 63 
0 8 16 24 32 40 48 56 64 72 
0 9 18 27 36 45 54 63 72 81 

常見的二維陣列輸入格式是由上而下、由左而右。

例如,若輸入資料為:

3 4
0 1 2 3
4 5 6 7
8 9 10 11

第一行的兩個數字是 mn,我們可以用以下方式讀入:

m, n = map(int, input().split())
a = []

for i in range(m):
    a.append([int(x) for x in input().split()])

也可以先將 a 初始化為 m 個空 list:

m, n = map(int, input().split())
a = [[] for i in range(m)]

for i in range(m):
    a[i] = [int(x) for x in input().split()]

比較推薦使用前者初始化變數與 list,除非事前無法得知元素個數。