python实现矩阵转置zip_用python的解包压包等方法方便地实现矩阵转置和翻转

在用python写2048小项目中,学习到了矩阵(就是二维列表)转置和翻转地代码,非常方便快捷,两种操作都只需要一行代码,显示了python强大地威力,下面写出这两行代码并做一个解析:

# 矩阵转置

def transpose(matrix):

return [list(row) for row in zip(*matrix)]

#矩阵水平翻转

def invert(matrix):

return [row[::-1] for row in matrix]

首先,matrix是一个二维列表,类似于:

matrix = [[0, 1, 2, 3], [4, 5, 6], [7, 8, 9, 10]]

在transpose()函数中,*matrix是解包操作,可以解包任何可迭代对象,而zip函数是压包操作。这里本质上就是matrix被解包成三个一维的列表被传入zip函数中,然后zip函数将对应的元素进行压包,就是取第一个列表的第一个元素,第二个列表的第一个元素,第三个列表的第一个元素,构成一个元组,然后又取第一个列表的第二个元素,第二个列表的第二个元素,第三个列表的第二个元素,又构成一个元组…最终形成元组的数量取决于元素最少的那个列表。list(row)是将zip函数返回的可迭代对象中的元素row这个元组给转换成列表。总结起来就是:

matrix先被解包成三个列表,传入zip函数,zip函数将三个列表的对应元素构造成元组,然后这些元组被list转换成列表,利用for in这个叫列表生成式的东西将这些列表合成构造为一个列表。

在invert函数中,主要就是用了row[::-1]这个叫列表切片的东西,我研究了一下这个表达式,得出了以下结论:

对于列表切片r[i:j:s],i是起始位置,j是结束位置,s是切片步长:

切片步长不能为0,否则会报错。

切片从r[i]开始,到r[j-1]结束

s>0时,i默认为0,j默认为len®,就是r的元素个数,s不写的话默认为1,举几个例子:

r[:]表示r的所有元素的切片,r[0:len®]和r[:]是相等的。

s<0时,i默认为len®-1,j默认为1,就是从最大的开始位置,到第一个元素处结束,举几个例子:

r[::-1]就表示列表的反转,r=[0,1,2,3],r[::-1]就是[3,2,1,0]。

i和j可以超出列表的元素范围,不会报错,只是超出范围的元素不会被加入切片中。

标签:zip,matrix,压包,转置,元素,解包,列表,元组,row

来源: https://blog.csdn.net/u013238941/article/details/88073965

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值