python实现二维列表(list)的旋转、反转

讲在前面的话,在leetcode刷到一道in-place的旋转图像的题,同时在想如果不原位旋转的话,肯定有其他简单的方法的,答案是肯定的。顺便写篇博客来记录一下Python中的反转list的方法。

1.Python中反转list的几种简单方法

1.1 使用reversed()的函数,它是一个生成器,返回一个对象

nums = [1,2,3,4,5]
reversed_nums = list(reversed(nums))
print(reversed_nums)   # [5, 4, 3, 2, 1]

1.2 使用列表中的切片

nums = [1,2,3,4,5]
reversed_nums = nums[::-1]

1.3 使用list的reverse方法(in-place)

nums = [1,2,3,9,4,5,6]
nums.reverse()   #[6, 5, 4, 9, 3, 2, 1]

1.4 二维list类似可以使用以上的方法就不在重复讲了

 

2.旋转图像

给定 matrix = 
[
  [1,2,3],
  [4,5,6],
  [7,8,9]
],
原地旋转输入矩阵,使其变为:
[
  [7,4,1],
  [8,5,2],
  [9,6,3]
]

解题思路:

先反转list, 然后交换对称

        """
         /*
         * clockwise rotate
         * first reverse up to down, then swap the symmetry 
         * 1 2 3     7 8 9     7 4 1
         * 4 5 6  => 4 5 6  => 8 5 2
         * 7 8 9     1 2 3     9 6 3
        */
        /*
         * anticlockwise rotate
         * first reverse left to right, then swap the symmetry
         * 1 2 3     3 2 1     3 6 9
         * 4 5 6  => 6 5 4  => 2 5 8
         * 7 8 9     9 8 7     1 4 7
        */
        """

2.1 in-place的解法

class Solution:
    def rotate(self, matrix: List[List[int]]) -> None:
        matrix.reverse()
        for i in range(len(matrix)):
            for j in range(i+1, len(matrix[i])):
                matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]

2.2 使用一行代码求解,但不是原位操作

original = [
  [ 5, 1, 9,11],
  [ 2, 4, 8,10],
  [13, 3, 6, 7],
  [15,14,12,16]
]

rotated = list(zip(*original[::-1]))   #[(15, 13, 2, 5), (14, 3, 4, 1), (12, 6, 8, 9), (16, 7, 10, 11)]

 

你可能感兴趣的:(数据结构与算法)