我试图找到一种转换矩阵的方法,例如:
[[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]
它会将矩阵更改为:
^{pr2}$到目前为止,我尝试了几种方法,但都没有奏效。我试过了:
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')
您尝试的解决方案存在一些问题:
来自
^{pr2}$zip(…)
的结果被丢弃,而是返回原始矩阵。写入return zip(*matrix)
。在与上面一样,来自
map(…)
的结果被丢弃。改为写return map(list, zip(*matrix))
。在参数名为
matrix
,但您正在处理m
。因此,要么重命名参数m
,要么将压缩后的值改为*matrix
。在示例:
实际上,您并没有将操作的结果赋值给,因此返回原始的
matrix
不变。例如:相反,请尝试:
^{pr2}$或者简单地说:
请记住,您还需要在调用函数中分配函数的返回值:
就地修改
或者,您可以就地转置并隐式
return None
:这样,当您调用函数时,您就不必将赋值返回到
matrix
。在示例
作用函数示例:
{cd4>行为
需要注意的是,
zip
会将其输出截断为最短的参数iterable,例如:因此,如果} from ^{} 插入伪
matrix
中的任何一行是空列表,则输出将是空列表。您可以使用^{fillvalue
s(默认情况下是None
),而不是:您可以将其实现为:
将
from itertools import zip_longest
放在脚本的顶部。在相关问题 更多 >
编程相关推荐