这个代码片段如何旋转矩阵?

Tam*_*lei 8 python

在寻找旋转矩阵的pythonic方法时,我遇到了这个答案.但是没有附加说明.我在这里复制了片段:

rotated = zip(*original[::-1])
Run Code Online (Sandbox Code Playgroud)

它是如何工作的?

Ash*_*ary 5

>>> 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中选择相同索引中的项目(它只运行到最小长度的项目)并将它们作为元组返回.

是什么*:

*用于拆包的所有项目revzip,所以不是手工输入 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)


tob*_*s_k 5

与Ashwini和HennyH的解释相辅相成,这里有一个小图来说明这个过程.

在此输入图像描述

  1. 首先,[::-1]切片运算符反转列表列表,取整个列表(因此可以省略前两个参数)并使用步骤-1.
  2. 其次,该zip函数采用多个列表并有效地返回一个新的列表,其中行和列被反转.这*表示列表列表已解压缩到多个列表中.

可以看出,这两个组合的操作将旋转矩阵.