python--sort,sorted,argsort

本文详细介绍了Python中sort和sorted函数的使用方法,包括基本语法、参数设置及应用场景;同时对比了两者之间的区别,并对numpy库中的argsort函数进行了深入解析。

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

1、sort 只是list类型的内建函数,对其他非列表型序列不适用。
>>> a = [5,2,1,9,6]
>>> a.sort()                 #默认从小到大
>>> a
[1, 2, 5, 6, 9]                  
>>> a.sort(reverse=True)     #reverse后从大到小
>>> a
[9, 6, 5, 2, 1]
原地排序,并不返回排序后的对象,a就是排序后的,默认从小到大 reverse=True,表示从大到小
2、sorted是所有类型的内建函数 ,返回排序后的对象,原对象不改变
     简单类型:list,tuple,string,用法:
>>> a = [5,2,1,9,6]
>>> b = sorted(a)
>>> b
[1, 2, 5, 6, 9]                #a是原对象,b是排序后的对象
>>> a
[5, 2, 1, 9, 6]
>>> b=sorted(a,reverse=True)
>>> b
[9, 6, 5, 2, 1]
>>> a
[5, 2, 1, 9, 6]
>>> a = ['aa','BB','bb','zz','CC']
>>> sorted(a)
['BB', 'CC', 'aa', 'bb', 'zz']
>>> sorted(a,reverse=True)
['zz', 'bb', 'aa', 'CC', 'BB'] 
进阶:sorted(a,key=...,reversed=True)
a = ['CCC', 'bb', 'ffff', 'z']
>>> sorted(a,key=len)             #按字符串个数排序
['z', 'bb', 'CCC', 'ffff']
>>> sorted(a,key=str.lower)       #将字符串转为小写之后排序
['bb', 'CCC', 'ffff', 'z']
>>> a=[{'age': 20, 'name': 'abc'}, {'age': 25, 'name': 'ghi'}, {'age': 30, 'name': 'def'}]
>>> sorted(a,key =lambda x:x['age'])    #按年龄排序
[{'age': 20, 'name': 'abc'}, {'age': 25, 'name': 'ghi'}, {'age': 30, 'name': 'def'}]
3、argsort,属于numpy中的函数
     返回排序后元素在原对象中的下标
a=array([(5,4,3,2,6),(7,8,0,1,9)])
>>> a
array([[5, 4, 3, 2, 6],
       [7, 8, 0, 1, 9]])
>>> a.argsort()
array([[3, 2, 1, 0, 4],
       [2, 3, 0, 1, 4]], dtype=int64)
>>> a.argsort(axis=0)
array([[0, 0, 1, 1, 0],
       [1, 1, 0, 0, 1]], dtype=int64)
这里要明白numpy下数组的排列:介绍三维数组,
[[[ 0  1  2  3]
  [ 4  5  6  7]
  [ 8  9 10 11]]

 [[12 13 14 15]
  [16 17 18 19]
  [20 21 22 23]]]
  • 最后的轴从左到右打印
  • 次后的轴从顶向下打印
  • 剩下的轴从顶向下打印,每个切片通过一个空行与下一个隔开。
  • 一维数组被打印成行,二维数组成矩阵,三维数组成矩阵列表。
默认axis= -1: 行,是最后一个轴
         axis=0: 剩余轴
         axis=-1:列
[[[ 0  1  2  3]
  [ 4  5  6  7]
  [ 8  9 10 11]]

 [[12 13 14 15]
  [16 17 18 19]
  [20 21 22 23]]]
a=array([arange(24)]).reshape(2,3,4)
>>> a.argsort()
array([[[0, 1, 2, 3],                    #按行排序
        [0, 1, 2, 3],
        [0, 1, 2, 3]],

       [[0, 1, 2, 3],
        [0, 1, 2, 3],
        [0, 1, 2, 3]]], dtype=int64)
>>> a.argsort(-1)
array([[[0, 1, 2, 3],                    #还是按行
        [0, 1, 2, 3],
        [0, 1, 2, 3]],

       [[0, 1, 2, 3],
        [0, 1, 2, 3],
        [0, 1, 2, 3]]], dtype=int64)
>>> a.argsort(axis=0)
array([[[0, 0, 0, 0],                    #按第三轴
        [0, 0, 0, 0],
        [0, 0, 0, 0]],

       [[1, 1, 1, 1],
        [1, 1, 1, 1],
        [1, 1, 1, 1]]], dtype=int64)
>>> a.argsort(axis=1)
array([[[0, 0, 0, 0],                    #按列0<4<8
        [1, 1, 1, 1],
        [2, 2, 2, 2]],

       [[0, 0, 0, 0],
        [1, 1, 1, 1],
        [2, 2, 2, 2]]], dtype=int64)
>>> 

参考: http://tech.ddvip.com/2013-02/1361016871190339.html
### 对包含列表的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、付费专栏及课程。

余额充值