函数transpose(a)
应该创建一个新矩阵,该矩阵是原始矩阵的转置,并将新矩阵返回给调用者。
这是我之前的尝试之一,如果我只使用循环,这对我来说是最有意义的......
def transpose(a):
m = [None]*len(a[0])
for i in range(len(a)):
m[i] = [None]*len(a)
for j in range(len(a[i])):
m[i][j] = a[j][i]
return m
我在 python shell 中尝试了以下代码: transpose([[4,8,10,68],[5,12,8,71],[5.5,11,8,70.5]])
但收到“IndexError:列表索引超出范围”
首先,请注意您没有矩阵。矩阵。相反,您有一个由列表
组成的列表
,这是表示矩阵数学抽象的一种方式。
您的代码的问题只是轴混淆了:
def transpose(a):
m = [None] * len(a[0])
for i in range(len(a[0])): # len(a[0]) is the number of elements in the inner list, but after transposition it will be the number of elements in the outer list
m[i] = [None] * len(a)
for j in range(len(a)): # and the other way round for len(a)
m[i][j] = a[j][i]
return m
也就是说,我建议采用不同的方法。使用enumerate
,我们可以同时引用a
的元素,及其索引:
def transpose(a):
m = [None] * len(a)
for i, sublist in enumerate(a):
m[i] = [None] * len(sublist)
for j, element in enumerate(sublist):
m[i][j] = element
return m
这保持了您最初答案的精神,但(IMO)更干净。
第三种方法是放弃创建填充 None
的 list
并使用 append
代替:
def transpose(a):
m = []
for i, sublist in enumerate(a):
m.append([])
for j, element in enumerate(sublist):
m[i].append(element)
return m
最后,为了完整起见,采用基于非循环的方法(请注意,内部元素是元组
而不是列表
:
def transpose(a):
return list(zip(*a))
我是一名优秀的程序员,十分优秀!