【leetcode】868. 转置矩阵 (zip的用法!) 转置的思想还是没有o(╥﹏╥)o

给定一个矩阵 A, 返回 A 的转置矩阵。

矩阵的转置是指将矩阵的主对角线翻转,交换矩阵的行索引与列索引。

示例 1:

输入:[[1,2,3],[4,5,6],[7,8,9]]
输出:[[1,4,7],[2,5,8],[3,6,9]]

示例 2:

输入:[[1,2,3],[4,5,6]]
输出:[[1,4],[2,5],[3,6]]

Python实现转置:https://www.cnblogs.com/anpengapple/p/5427367.html

其实不动脑筋的话,用个二重循环很容易写出来:

复制代码
def trans(m):
    a = [[] for i in m[0]]
    for i in m:
        for j in range(len(i)):
            a[j].append(i[j])
    return a

m = [[1, 2], [3, 4], [5, 6]]    # 想象第一个列表是原始的,后面的是往里添加的
print trans(m)    # result:[[1, 3, 5], [ 2, 4, 6]]
复制代码

然后又是一个不小心的发现:

这种转置矩阵的即时感是怎么回事?

没错,这个问题的本质就是求解转置矩阵。于是就简单了,还是用个不动脑筋的办法:

复制代码
def trans(m):
    for i in range(len(m)):
        for j in range(i):
            m[i][j], m[j][i] = m[j][i], m[i][j]
    return m

m = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print trans(m)
复制代码

其实还是有点bug的,看起来是好用的,然而这个矩阵要求行列长度相同才行。

最后,群里某大神说:如果只是转置矩阵的话,直接zip就好了。这才想起来zip的本质就是这样的,取出列表中的对应位置的元素,组成新列表,正是这个题目要做的。

所以最终,这个题目(转置矩阵)的python解法就相当奇妙了:

def trans(m):
    return zip(*d)

没错,就这么简单。python的魅力。

超强!

class Solution:

    def transpose(self, A): # 方法一

        A[::] = zip(*A)

        return A


    def transpose1(self, A): # 方法二

        if len(A) == 0: return []

        r, c = len(A), len(A[0])

        return [[A[i][j] for i in range(r)] for j in range(c)]


if __name__ == '__main__':

solu = Solution()

A = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

print(solu.transpose(A))
Python zip 总结:
 
(1)zip(): 相当于压缩,简单理解就是, 把长度相等的几列数据,压缩成一个矩阵,变成按行储存。例如:
 
x = ['1', '2', '3']

y = ['a', 'b', 'c']

z = list(zip(x, y))

print(z) # [('1', 'a'), ('2', 'b'), ('3', 'c')]

(2)zip(*):相当于解压,简单理解就是,把一个矩阵本来是一行一行的储存的,现在解压成一列一列的储存,相当于矩阵转置。例如:

x = [['1', 'a'], ['2', 'b'], ['3', 'c']]

z = list(zip(*x))

print(z) # [('1', '2', '3'), ('a', 'b', 'c')]
​​​​​​​ 注意:如果要直接输出,zip()内容要经过 list() 之后才能显示出来。
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值