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

本文介绍了Python中反转列表的多种方法,包括使用reversed()函数、列表切片、reverse()方法等,并详细解析了一个图像旋转问题的解决思路,通过先反转列表再交换对称元素实现图像的原地旋转。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

讲在前面的话,在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)]

 

### 对包含列表Python二维数组进行排序 对于包含列表Python二维数组,可以利用`numpy`库来处理和操作这些数据。如果目标是对整个二维数组按照某一列或某几列的数据进行排序,则可以通过指定轴参数以及键函数实现。 考虑一个简单的例子,在这个例子中创建了一个由随机整数构成的二维数组,并展示了如何基于特定条件对其进行排序: ```python import numpy as np np_baseball = np.array([[1, 2], [3, 4], [5, 6]]) # 创建一个简单示例性的二维数组[^1] # 如果想要根据第二列数值升序排列该二维数组 sorted_array = np_baseball[np.argsort(np_baseball[:, 1])] print(sorted_array) # 若要降序排列只需调整argsort内的比较逻辑或者反转最终索引顺序 descending_sorted_array = np_baseball[np.argsort(-np_baseball[:, 1])] print(descending_sorted_array) ``` 上述代码片段通过`np.argsort()`方法获取排序后的索引位置,进而重新安排原始数组中的元素达到排序效果。这里假设要依据每行第二个元素(即第1列)来进行排序;如果是其他需求比如按多列组合排序或者其他更复杂的规则,则可能需要用到自定义的关键字函数配合`sorted()`内置函数完成任务。 当涉及到更加复杂的情况,例如每个子列表内部结构不一致或是希望根据某些特殊属性而非单纯数值大小来决定先后次序时,推荐先将二维数组转化为Pandas DataFrame对象再做进一步的操作会更为方便灵活。这允许使用诸如`.sort_values()`这样的高级API接口轻松达成目的[^2]。 ```python import pandas as pd df = pd.DataFrame({'col1': ['a', 'b', 'c'], 'col2': [[1, 2], [3, 4], [5]]}) df['col2_str'] = df.col2.apply(lambda x: ''.join(map(str,x))) # 将list转成字符串以便于直接比较 result_df = df.sort_values(by=['col2_str']) print(result_df) ``` 在这个案例里,为了能够正确地对比不同长度的列表内容,先把它们转换成了字符串形式作为辅助列参与排序过程。当然实际应用当中应当根据具体场景选取最合适的策略。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值