一、二维列表基础
列表名 = [[一维列表],[一维列表],[一维列表],……]
二维列表可以看作特殊的一维列表,通过两个下标进行访问。二维列表中的各个一维列表长度可以不相同。
d = [[1, 2, 3], [2, 3, 4], [4, 5, 6]]
for i in range(len(d)):
for j in range(len(d[i])):
print('%3d' %d[i][j], end=' ')
print()
语句d创建了一个三行三列的二位列表,len(d)返回二位列表d的行数,len(d[i])返回下标为i的行中包含的元素个数。
二维列表的创建可以通过赋值语句实现,若创建还不太确定二维列表中的具体数据,可以给定某个特殊值,并于*进行复制。
b = [[0]*5]*4
创建包含四行五列的二维列表。
可以使用is或is not检测二维列表的各行的一维列表或各个元素是否相同对象。
d = [[0]*2]*2
print(d[0] is d[1]) #True
print(d[0][0] is d[1][0]) #True
若修改使用*复制一维列表所得二维列表中的各个元素,则使用不同标识的同一对象只能保存最后更新的数据。
使用列表的成员函数append()可以往二维列表中添加一维列表
d = [[0]*2]*2
d.append([0]*2)
print(d[2] is d[0]) #False
append()方法添加的行与其余各行都不是相同对象。
二维列表的使用
Q:如何在输入两个整数m、n之后,给m行n列的二维列表的每个元素赋值?
A1:用列表产生式创建二维列表 a = [[0]*n for i in range(m)]
m, n = map(int, input().split())
a = [[0]*n for i in range(m)]
for i in range(m):
for j in range(n):
a[i][j] = (i+1) * (j+1)
for i in range(m):
for j in range(n):
if j > 0:
print('', end= '')
print(a[i][j], end='')
print()
A2:初始化二维列表a为空列表,在一个执行m次的循环中,每次往二维列表a中添加包含n个0的一维列表。
m, n = map(int, input().split())
a = []
for i in range(m):
t = [0] * n
a.append(t)
for i in range(m):
for j in range(n):
a[i][j] = (i+1)*(j+1)
for i in range(m):
for j in range(n):
if j >0:
print(' ', end=' ')
print(a[i][j], end='')
print()
Q:创建m行n列的二维列表一个有几种方法?
A:四种
b = [0]*n
a = [b]*m
a = [[0]*n]*m
a = [[0]*n for i in range(m)]
a = []
for i in range(m):
a.append([0] * n)
二、二维列表的运用
1、方阵转置
第一行先输入一个整数n,接下来的n行每行输入n个整数构成一个n阶方阵,请将之转置并输出这个转置后的方阵。
解读:将方阵的行列进行互换。
n = int(input())
a = [[0] * n] * n
for i in range(n):
a[i] = list(map(int, input().split()))
for i in range(n):
for j in range(i):
a[i][j], a[j][i] = a[j][i], a[i][j]
for i in range(n):
print(* a[i])
2、杨辉三角形
输入整数n,构成并输出杨辉三角形。
解读:杨辉三角形:第一行的第一个和最后一个都是1,从第三行开始,其他元素a[i] [j] 等于其前一行同一列元素a[i-1] [j]及前一行前一列元素a[i-1] [j-1]之和。
n = int(input())
a = [[1] * i for i in range(1, n+1)]
for i in range(2, n):
for j in range(1, i):
a[i][j] = a[i-1][j] + a[i-1][j-1]
for i in range(n):
for j in range(i+1):
print('%5d' %a[i][j], end='')
print()
3、蛇形矩阵
输入整数n,构造并输出蛇形矩阵。
解读:蛇形矩阵是由1开始的自然数依次排列成的一个上三角矩阵。每行从第一列的元素开始,其右上角的元素一次递增1,到第一行为止。
n = int(input())
a = [[0] * (n - i) for i in range(n)]
val = 1
for i in range(n):
k = 0
for j in range(i, -1, -1):
a[j][k] = val
k += 1
val += 1
for i in range(n):
print(* a[i])