我有一个要做的任务,即:
编写一个函数转置,它接受一个矩阵并对其进行转置。基本上,这会将m x n矩阵转换为n x m矩阵。
我写了一段似乎合理的代码,但它并没有让我得到我想要的结果。任何人都可以指出我的代码有什么问题吗?
def transpose(matrix):
new_matrix=[[]]*len(matrix[0])
for row in matrix:
i=0
for j in row:
new_matrix[i]+=[j]
i+=1
return new_matrix
测试用例:
print(transpose([[ 1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]))
答案 0 :(得分:1)
如果使用*
在列表初始化中乘以某些值,请小心。您可能最终会将多次引用指向相同的值:
l = [ [] ]*3
print(l)
l[1].append(34) # change only "the first" list by appending smth
print(l)
输出:
[[], [], []]
[[34], [34], [34]] # they are all "the same data" reference
内置的zip()完全可以完成您的转置:
l = [[ 1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
l_t = [ list(x) for x in zip(*l)] # one-line solutions for transposing ;)
print(l)
print(l_t) # transposed
Zip有一个限制,它只适用于最小的子列表的长度 - 你的都是相同的,所以一切都很好。
输出:
[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
如果您需要一个包含最长列表的zip,itertools.zip_longest(..)
可以使用,则需要使用默认参数替换不存在的任何较短列表项。
顺便说一下。只有list(zip(l))
看起来像这样:[(1,5,9),(2,6,10),(3,7,11),(4,8,12)]
- 它会在您放入其中的可迭代部分的相同索引上创建元组。
手工:
l = [[ 1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
l2 = []
for colIdx in range(len(l[0])): # 0-3 iterate over the inner indexes first
newRow = []
for rowIdx in range(len(l)): # 0-2 then over the outer ones
newRow.append(l[rowIdx][colIdx])
l2.append(newRow)
print(l2) # [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
答案 1 :(得分:1)
我的意思是这样的:
def t(array): #The original array has size mxn
duplicate = [[0 for x in range(len(array))] for y in range(len(array[1]))] #You create an array of size nxm, which is filled with zeros
for i in range(len(array)): #Loop over the rows
for j in range(len(array[i])): #Then loop over the columns
duplicate[j][i] = array[i][j] #Replace j,i or duplicate with i,j th element of original
return duplicate
现在,
>>> t([[ 1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]