函数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
我尝试使用transpose([[4,8,10,68],[5,12,8,71],[5.5,11,8,70.5]])
在python shell中执行代码,但收到“ IndexError:列表索引超出范围”
答案 0 :(得分:0)
首先,请注意您没有矩阵。相反,您拥有list
中的lists
,这是表示矩阵的数学抽象的一种方法。
您的代码存在的问题就是您将轴混合在一起了:
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)更加干净。
第三种方法是省去创建lists
并填充None
的情况,而改为使用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
最后,为完整起见,请使用基于非循环的方法(请注意,内部元素是tuples
而不是lists
:
def transpose(a):
return list(zip(*a))
答案 1 :(得分:0)
正确的代码版本:
def transpose(a):
m = [None]*len(a[0])
for i in range(len(a[0])):
m[i] = [None]*len(a)
for j in range(len(a)):
m[i][j] = a[j][i]
return m
遍历数组时犯了两个小错误,第一个循环是range(len(a))
,但是当您想逐列通过2d数组时应该是range(len(a[0]))
,第二个错误是{ {1}},而不是range(len(a[i]))
。在遍历2d数组时,您将两个轴翻转了。
在python中,您不需要按照自己的方式分配内存,因为底层类型只是列表的列表,因此可以使用range(len(a))
方法来添加元素。
您可以尝试以下使用列表理解概念的代码。
append