此代码片段如何旋转矩阵?

在寻找一种旋转矩阵的pythonic方法时,我遇到了这个答案。但是,没有附加说明。我在此处复制了代码段:

rotated = zip(*original[::-1])

它是如何工作的?


斯蒂芬大帝
浏览 187回答 3
3回答

慕妹3242003

>>> lis = [[1,2,3], [4,5,6], [7,8,9]][::-1] 反转列表:>>> rev = lis[::-1]>>> rev[[7, 8, 9], [4, 5, 6], [1, 2, 3]]现在我们zip在rev的所有项目上使用,并将每个返回的元组附加到旋转后的元素上:>>> rotated = []>>> for item in zip(rev[0],rev[1],rev[2]):...     rotated.append(item)...     >>> rotated[(7, 4, 1), (8, 5, 2), (9, 6, 3)]zip 从传递给它的每个iterable的相同索引中选择项目(它最多运行到具有最小长度的项目),并将它们作为元组返回。什么是*:*用于解压缩revto的所有项目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)]

阿波罗的战车

作为Ashwini和HennyH的解释的补充,以下是一个小图来说明该过程。首先,[::-1]slice运算符反转列表的列表,获取整个列表(因此可以省略前两个参数),并使用步骤-1。其次,该zip函数采用多个列表,并有效地返回行和列反转的新列表。该*说列表清单中解压缩到几个列表。可以看出,这两个操作的组合将旋转矩阵。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python