赞
踩
1、通过一道题目,学会怎么使用zip(*),[::-1]
zip()函数用于将可迭代的对象作为参数,将对象中的对应元素打包成一个个元祖,然后返回由这些元祖组成的列表。
如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用号操作符,可将元祖解压为列表。
注意:python3中为了减少内存,zip()返回的是一个对象。如果需要展示里诶博爱,需要手动list()转换。
强化理解:
zip()相当于对几个迭代器取第一个元素,然后生成新的元祖作为第一行,
zip()相当于拆解一个迭代器。比如说将一个3*3矩阵,取第一列作为一个新的元祖,第二列作为第二个新的元祖…
以leetcode上面的一道题为例:
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
# 这种方法速度更快但也更难以理解,将list看成tuple解压,恰好得到我们“行列互换”的效果,再通过对每个 元素应用list()函数,将tuple转换为list
res = []
while matrix:
res += matrix.pop(0) # 将矩阵的第一行删掉,存放到res中
# matrix = list(zip(*matrix))[::-1] # 利用zip和*进行行列转换,外面是列表,里面是元祖
matrix = list(map(list, zip(*matrix)))[::-1] # 外面是列表,里面也是列表
return res
注意:
(1)zip(matrix)相当于将一个矩阵沿着主对角线做对称交换。
(2)[::-1]相当于按行做倒序,因为matrix是一个33矩阵,就相当于按照行做倒序。即[[1,2,3],[4,5,6],[7,8,9]]变成[[7, 8, 9], [4, 5, 6], [1, 2, 3]]。
(3)将上面两个操作合并相当于进行逆时针旋转90°。
延伸:
顺时针旋转:
(1)先进行一个[::-1]做一个反转。
(2)然后使用zip(*matrix)相当于将一个矩阵沿着主对角线做对称交换。
(3)将上面两个操作合并相当于进行顺时针旋转90°。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。