python3 3矩阵_关于python:转置这个矩阵(python3)

本问题已经有最佳答案,请猛点这里访问。

我试图找到一种转置矩阵的方法,例如:

[[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))返回矩阵使矩阵与之前相同

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值