转置这个矩阵(Python3)

2021-04-11 14:50:51 发布

您现在位置:Python中文网/ 问答频道 /正文

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

[[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')
2条回答
网友
1楼 ·

您尝试的解决方案存在一些问题:

def transpose_matrix(matrix):
    zip(*matrix)
    return matrix

来自zip(…)的结果被丢弃,而是返回原始矩阵。写入return zip(*matrix)。在

^{pr2}$

与上面一样,来自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]]
网友
2楼 ·

实际上,您并没有将操作的结果赋值给,因此返回原始的matrix不变。例如:

def transpose_matrix(matrix):
    zip(*matrix) # ignore result of computation
    return matrix # return argument unchanged 

相反,请尝试:

^{pr2}$

或者简单地说:

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]]

{cd4>行为

需要注意的是,zip会将其输出截断为最短的参数iterable,例如:

>>> 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中的任何一行是空列表,则输出将是空列表。您可以使用^{} from ^{}插入伪fillvalues(默认情况下是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放在脚本的顶部。在

相关问题