在寻找旋转矩阵的pythonic方法时,我遇到了这个答案.但是没有附加说明.我在这里复制了片段:
rotated = zip(*original[::-1])
Run Code Online (Sandbox Code Playgroud)
它是如何工作的?
>>> lis = [[1,2,3], [4,5,6], [7,8,9]]
Run Code Online (Sandbox Code Playgroud)
[::-1] 颠倒列表:
>>> rev = lis[::-1]
>>> rev
[[7, 8, 9], [4, 5, 6], [1, 2, 3]]
Run Code Online (Sandbox Code Playgroud)
现在我们使用ziprev的所有项目,并将每个返回的元组追加到旋转:
>>> rotated = []
>>> for item in zip(rev[0],rev[1],rev[2]):
... rotated.append(item)
...
>>> rotated
[(7, 4, 1), (8, 5, 2), (9, 6, 3)]
Run Code Online (Sandbox Code Playgroud)
zip 从传递给它的每个iterable中选择相同索引中的项目(它只运行到最小长度的项目)并将它们作为元组返回.
是什么*:
*用于拆包的所有项目rev来zip,所以不是手工输入
rev[0], rev[1], rev[2],我们可以简单地做zip(*rev).
上面的zip循环也可以写成:
>>> rev = [[7, 8, 9], [4, 5, 6], [1, 2, 3]]
>>> min_length = min(len(x) for x in rev) # find the min length among all items
>>> rotated = []
for i in xrange(min_length):
items = tuple(x[i] for x in rev) # collect items on the same index from each
# list inside `rev`
rotated.append(items)
...
>>> rotated
[(7, 4, 1), (8, 5, 2), (9, 6, 3)]
Run Code Online (Sandbox Code Playgroud)
与Ashwini和HennyH的解释相辅相成,这里有一个小图来说明这个过程.

[::-1]切片运算符反转列表列表,取整个列表(因此可以省略前两个参数)并使用步骤-1.zip函数采用多个列表并有效地返回一个新的列表,其中行和列被反转.这*表示列表列表已解压缩到多个列表中.可以看出,这两个组合的操作将旋转矩阵.
| 归档时间: |
|
| 查看次数: |
152 次 |
| 最近记录: |