我试图找到一种转置矩阵的方法,例如:
[[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]
它会将矩阵更改为:
[[1, 4, 7],
[2, 5, 8],
[3, 6, 9]]
到目前为止,我尝试了几件事,但从未奏效。我试过了:
def transpose_matrix(matrix): # this one doesn't change the matrix at all
zip(*matrix)
return matrix
或
def transpose_matrix(matrix):
map(list, zip(*matrix))
return matrix
或
def transpose_matrix(matrix): # this one returns an empty list []
print(list(zip(*matrix)))
我想在不使用numpy
等外部库的情况下对其进行编码。
之后,它将结果返回到此菜单,并使用转置矩阵作为即将发布的选项(未显示):
def menu(matrix):
print('choose option')
loop = True
while loop:
print('''
1-display matrix
7-transpose it
8-other option
0-back
''')
choi = input('cchoice:')
if choi =='1':
print('\n'.join([' '.join(map(str, row)) for row in matrix]))
elif choix == '7':
matrix = transpose_matrix(matrix)
else:
print('invalid choice')
答案 0 :(得分:2)
您实际上并未分配操作的结果,因此返回原始matrix
不变。例如:
def transpose_matrix(matrix):
zip(*matrix) # ignore result of computation
return matrix # return argument unchanged
相反,请尝试:
def transpose_matrix(matrix):
matrix = list(map(list, zip(*matrix))) # assign result
return matrix # return transposed matrix
或简单地说:
def transpose_matrix(matrix):
return list(map(list, zip(*matrix)))
请记住,您还需要在调用函数中分配函数的返回值:
matrix = transpose_matrix(matrix)
就地修改
或者,您可以就地转置return None
:
def transpose_matrix(matrix):
matrix[:] = list(map(list, zip(*matrix)))
这样,您在调用函数时无需返回matrix
。
<强>实施例强>
行动中的功能示例:
>>> def transpose_matrix(matrix):
return list(map(list, zip(*matrix)))
>>> transpose_matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]
>>> def in_place_transpose(matrix):
matrix[:] = list(map(list, zip(*matrix)))
>>> m = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> in_place_transpose(m)
>>> m
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]
zip
行为
重要的是要注意zip
将其输出截断为可迭代的最短参数,例如:
>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> c = [7, 8]
>>> d = [9]
>>> e = []
>>> for l in (b, c, d, e):
print(list(zip(a, l)))
[(1, 4), (2, 5), (3, 6)]
[(1, 7), (2, 8)]
[(1, 9)]
[]
因此,如果matrix
的任何行都是空列表,则输出将为空列表。您可以使用zip_longest
from itertools
来插入虚拟fillvalue
s(默认情况下为None
):
>>> from itertools import zip_longest
>>> list(zip_longest([1, 2, 3], [4, 5]))
[(1, 4), (2, 5), (3, None)]
>>> m = [[1, 2, 3], [4, 5, 6], []]
>>> list(zip_longest(*m, fillvalue=0))
[(1, 4, 0), (2, 5, 0), (3, 6, 0)]
您可以将其实现为:
def transpose_matrix(matrix):
return list(map(list, zip_longest(*matrix, fillvalue=0)))
脚本顶部有from itertools import zip_longest
。
答案 1 :(得分:1)
您尝试的解决方案存在一些问题:
def transpose_matrix(matrix):
zip(*matrix)
return matrix
zip(…)
的结果将被丢弃,您将返回原始矩阵。写return zip(*matrix)
。
def transpose_matrix(matrix):
map(list, zip(*matrix))
return matrix
与上述相同,map(…)
的结果将被丢弃。改为写return map(list, zip(*matrix))
。
def transpose_matrix(matrix):
print(list(zip(*m)))
参数名为matrix
,但您正在使用m
。因此,请重命名参数m
,或将压缩值更改为*matrix
。
示例:
>>> m = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> list(zip(*m))
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
>>> list(map(list, zip(*m)))
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]