本问题已经有最佳答案,请猛点这里访问。
我试图找到一种转置矩阵的方法,例如:
[[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('
'.join([' '.join(map(str, row)) for row in matrix]))
elif choix == '7':
matrix = transpose_matrix(matrix)
else:
print('invalid choice')
您实际上并未分配操作结果,因此返回原始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的任何行都是空列表,则输出将为空列表。您可以使用itertools中的zip_longest来插入虚拟fillvalue(默认情况下为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。
我尝试了所有选项,每次矩阵保持不变
@Program_coder我添加了更多 - 你需要分配函数的结果或修改matrix就地
我尝试了所有,没有任何作品!我不明白;要么返回一个空列表,要么根本不改变矩阵;我使用print( n.join([.join(map(str,row))为矩阵中的行]))在菜单模块中显示矩阵,并在传入转置模块后显示相同的矩阵
@Program_coder你确定你正在将计算结果分配回名称matrix,或者就地修改它吗?这段代码非常适合我。您可以编辑您的问题,以准确显示您现在拥有的代码,所需的输入以及您获得的输出 - 您甚至可以直接从解释器粘贴,就像我刚刚完成的那样。
@ jonrsharpe我编辑了我的问题以获得完整的代码
@Program_coder是的,你还没有将transpose_matrix的结果分配给任何东西。使其matrix = transpose_matrix(matrix),或使用该函数的就地版本。它已经在我的回答中告诉你了。
对不起,我是编程新手。我编辑了我的问题,这是你的意思吗?在选项7.我尝试过,当我选择选项1打印矩阵时,它打印[],而之前的矩阵是[[1,2,3],[4,5,6],[]]
@Program_coder啊,最后我看到了问题;你的示例矩阵不具有代表性。我已经相应地编辑了我的答案。另请注意choix != choi。
当我写清单时,它说zip_longest全局名称未定义(错误)(zip_longest(* matrix,fillvalue = 0))
@Program_coder其部分itertools;你需要from itertools import zip_longest
来自itertools导入zip_longest列表(zip_longest(* matrix,fillvalue = 0))返回矩阵然后当我从上面的菜单中选择选项1时,它显示相同的矩阵
@Program_coder该代码很难在评论中阅读。但是,看起来您仍然没有将计算结果分配回matrix。我放弃了:将import放在脚本的顶部,然后复制并粘贴刚刚添加到我问题末尾的函数。
它终于奏效了。最后。是的!我的最后一个问题是,是否可以显示任何内容而不是0值?当我显示列表时。非常感谢所有支持。
@Program_coder你可以使用fillvalue="",但如果后来的代码期望所有值都是数字,可能会遇到麻烦。 0是矩阵的有效值吗?您可以使用默认的fillvalue=None然后print("
".join("".join(str(i) if i is not None else"" for i in row) for row in matrix))。
您尝试的解决方案存在一些问题:
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]]
print(list(zip(* matrix)))打印一个空列表[],我刚尝试过
map(list,zip(* matrix))返回矩阵使矩阵与之前相同