上一篇学习了argsort
接着学习sorted
我记得<python编程从入门到实践>这本书里,在一起介绍了sort, sorted,在对list进行排序时,两者都可以用,但是sort是把原有list改变了,无返回值,而sorted是返回一个排序后的list,不会改变原来的list。但是其实两者之间不只是这点区别,或者说sorted的强大处可不是这些,sort是在list上用,而sorted是可迭代对象都可以的,还记得fluent python中专门针对sorted讲了一节课。
默认sorted返回的是你要排序的对象的排序结果,可以升序排序(默认),也可以降序即从大到小排序。
a = [1, 3, 6, 5, 2, 7, 9] print('a:', a) print ('sorted a:', sorted(a)) print ('a:',a) print ('sored a from max to min:', sorted(a, reverse=True ))
默认是从小到大排序,通过reverse=True将排序转变为从大到小排序。而且是稳定排序,一般使用的是mergesort排序。
那么如果我想得到排序的索引号呢?sorted给我们提供了key这个参数可以用。
如果我们想返回排序后的序号,可以利用key进行完成。
a = [1, 3, 6, 5, 2, 7, 9] print('a:', a) print ('sorted a:', sorted(a)) print ('a:',a) print ('sored a from max to min:', sorted(a, reverse=True )) sorted_id = sorted(range(len(a)), key=lambda k: a[k], reverse=True) print('元素索引序列:', sorted_id)
以下来自官方
https://docs.python.org/zh-cn/3/library/functions.html#sorted
sorted(iterable, /, *, key=None, reverse=False)
根据 iterable 中的项返回一个新的已排序列表。
具有两个可选参数,它们都必须指定为关键字参数。
key 指定带有单个参数的函数,用于从 iterable 的每个元素中提取用于比较的键 (例如 key=str.lower
)。 默认值为 None
(直接比较元素)。
reverse 为一个布尔值。 如果设为 True
,则每个列表元素将按反向顺序比较进行排序。
使用 functools.cmp_to_key()
可将老式的 cmp 函数转换为 key 函数。
内置的 sorted()
确保是稳定的。 如果一个排序确保不会改变比较结果相等的元素的相对顺序就称其为稳定的 --- 这有利于进行多重排序(例如先按部门、再按薪级排序)。